为什么这个调用只是第一种方法?

Why is this calling only the first method?

提问人:MDK 提问时间:4/16/2023 最后编辑:BramMDK 更新时间:4/16/2023 访问量:77

问:

我单独调用所有方法,但不知何故,只有第一个方法被调用并打印到控制台,在这种情况下是 charisma 方法。

static void Main(string[] args)
{
    Console.WriteLine("Please enter a desired target level");

    attributeConstructor("Charisma"); // We call the attribute Constructor evertime for a new variable
    attributeConstructor("Strength");
    attributeConstructor("Perception");
    attributeConstructor("Intelligence");
    attributeConstructor("Movement");
    attributeConstructor("Finesse");
    attributeConstructor("Willpower");
    attributeConstructor("Constitution");
}

这就是外观,不言自明,只是一些算术。attributeConstructorattribute.nameattribute.levelattribute.modifier

// The aptly named attributeConstructor calls the attribute class to construct an attribute. No way!
static void attributeConstructor(string attributeName)
{
    Attribute attributePrintName = new Attribute(attributeName);
    Console.WriteLine(
        "Attribute: "
            + attributePrintName.name
            + " Level: "
            + attributePrintName.level
            + " Modifier: "
            + attributePrintName.modifier
    );
}

让我知道我是否应该发布完整的代码。Stackoverflow 不希望我在问题中发布“大部分代码”:/

C# Methods 构造函数

评论

1赞 Guru Stron 4/16/2023
您需要发布重现问题的代码。这不会 - 自己看
0赞 Flydog57 4/16/2023
在你的代码中吗?AttributeSystem.Attribute
0赞 MDK 4/16/2023
@GuruStron 对不起,我想发布整个代码,但 Stackoverflow 不允许我,这是代码 dotnetfiddle.net/TEuARQ 我意识到当我输入更多值时,它也会执行其他方法。我该如何解决这个问题?

答:

1赞 Etienne de Martel 4/16/2023 #1

让我们来看看你的班级Attribute

public class Attribute
{
    int globalLevel = Convert.ToInt32(Console.ReadLine());

    // the rest is irrelevant
}

哦,嘿,非静态字段的字段初始值设定项。您知道每次创建新实例时,它都会在构造函数之前运行吗?这意味着每次你写的时候,执行都会停止。老实说,这有点尴尬的用户体验。你可以让它,但它会在你第一次实例化类或访问它的任何静态成员之前运行。这更尴尬,因为从类的任何用户来看,它甚至不那么明显,而且这会使它成为一个全局变量,这很糟糕new AttributeReadLine()static

一般来说,我不喜欢构造函数中的副作用。构造函数应构造对象。如果他们需要外部数据,应该提供给他们。

如果不是将其声明为字段,而是向构造函数添加参数,那就更好(也更清晰了)。然后你只读一次(理想情况下就是在那个提示之后,这可能是你的目标)并传递它。"Please enter a desired target level"

public class Attribute
{
    // no globalLevel field here!
    
    // other stuff
    
    public Attribute(string attributeName, int globalLevel)
    {
        // rest of constructor goes here
    }
}

static void attributeConstructor(string attributeName, int globalLevel)
{
    Attribute attributePrintName = new Attribute(attributeName, globalLevel);
    // snip
}

static void Main(string[] args)
{
    Console.WriteLine("Please enter a desired target level");
    int globalLevel = int.Parse(Console.ReadLine()); // so obvious, reading after writing that we want a value
    
    attributeConstructor("Charisma", globalLevel);
    // etc.
}

评论

0赞 MDK 4/16/2023
我希望我能避免将“globalLevel”写入每个构造函数,但我想我真的别无选择?
0赞 Etienne de Martel 4/16/2023
你总是可以制作它并分配它,但共享可变状态在任何设计中总是一个坏主意。staticMain()