提问人:MDK 提问时间:4/16/2023 最后编辑:BramMDK 更新时间:4/16/2023 访问量:77
为什么这个调用只是第一种方法?
Why is this calling only the first method?
问:
我单独调用所有方法,但不知何故,只有第一个方法被调用并打印到控制台,在这种情况下是 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");
}
这就是外观,不言自明,只是一些算术。attributeConstructor
attribute.name
attribute.level
attribute.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 不希望我在问题中发布“大部分代码”:/
答:
1赞
Etienne de Martel
4/16/2023
#1
让我们来看看你的班级Attribute
public class Attribute
{
int globalLevel = Convert.ToInt32(Console.ReadLine());
// the rest is irrelevant
}
哦,嘿,非静态字段的字段初始值设定项。您知道每次创建新实例时,它都会在构造函数之前运行吗?这意味着每次你写的时候,执行都会停止。老实说,这有点尴尬的用户体验。你可以让它,但它会在你第一次实例化类或访问它的任何静态成员之前运行。这更尴尬,因为从类的任何用户来看,它甚至不那么明显,而且这会使它成为一个全局变量,这很糟糕。new Attribute
ReadLine()
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
你总是可以制作它并分配它,但共享可变状态在任何设计中总是一个坏主意。static
Main()
评论
Attribute
System.Attribute