创建预初始化类的最佳做法是什么。例如
Chip chip = new Atmega8();
我想将其属性定义为:
chip.Name = "Atmega8 AVR Chip";
等等。
如何在C#中实现它?
我应该将readonly public
属性或属性与private set
一起使用吗?
答案 0 :(得分:4)
让构造函数初始化值:
class Atmega8 {
public Atmega8 ()
{
Name = "Atmega8 AVR Chip";
}
public string Name { get; set; }
}
如果您希望Name
对所有实例都相同,那么在基类中声明它abstract
并覆盖getter可能是有意义的:
abstract class Chip {
public abstract string Name { get; }
}
class Atmega8 : Chip {
public override string Name {
get { return "Atmega8 AVR Chip"; }
}
}
因为我们还没有定义set
方法,所以不能更改该值,就像readonly
变量一样,除了它甚至不存储在任何地方,只是在每次调用时返回。
答案 1 :(得分:3)
如果希望编译器强制执行初始化后没有任何内容可以更改字段的值,则将其设置为只读字段,并将其填充到类的构造函数中(或者在声明时简单地初始化它)它;虽然继承,但这并不能很好地工作。如果您不关心,只要对象外部没有任何内容可以更改它(意味着您将信任自己的编码规则以确保它不会在内部更改),具有支持字段或自动属性的get-only属性有私人二传手,是你的赌注。
如果你绝对没有想要为特定类改变值,那么我会使它成为一个只返回属性,返回字符串文字或常量。我建议在文字上使用常量,因为你可以将常量放入它们自己的静态类中,然后可以从每个Chip类中单独使用它们。
但是,你应该知道一些常量的怪癖。 .NET中的常量值不仅存储在包含声明代码的程序集的清单中,而且存储在引用声明程序集的每个程序集中。每个程序集的代码都使用自己的清单中的值。因此,如果常量值EVER发生更改,则必须重新编译引用声明程序集的任何程序集,以使用新值更新这些程序集的清单。否则,常量将仅在声明程序集中使用时具有其新值。因此,不应轻易将变量标记为常量。就个人而言,我的观点是,如果常数不是宇宙的继续存在和运作所依赖的某个值,如pi,e,真空中的光速,普朗克常数,阿伏加德罗数等,那么它就不是t“常数”。任何其他内容,如通信代码序数,CAN更改,即使这样做也会破坏与程序的每个先前版本的兼容性。
答案 2 :(得分:1)
取决于你想要完成的事情。
看起来您永远不希望Name
的值发生变化。一种方法是在Name
中将abstract
声明为Chip
,并在每个子类中实现Name
以返回常量字符串值。
abstract class Chip
{
public abstract string Name { get; }
}
class Amiga8 : Chip
{
public override string Name { get { return "Atmega8 AVR Chip"; } }
}
class Program
{
static void Main(string[] args)
{
Chip chip = new Amiga8();
Console.WriteLine(chip.Name);
}
}
答案 3 :(得分:1)
在Atmega8类的构造函数中,您可以将属性设置为某个属性。即:
public Atmega8() {
Name = "Atmega8 AVR Chip";
}
如果您不希望在运行时更改该属性,则可以将该属性标记为只读(仅可通过声明性构造函数指定)。
private readonly string _Name = string.Empty;
public string Name {
get { return _name; }
}
public Atmega8() {
_Name = "Atmega8 AVR Chip";
}
答案 4 :(得分:0)
财产价值无法改变 - >只读公共财产。
财产价值可以改变 - > private set
答案 5 :(得分:0)
如果您不想更改它,请在Atmega8类上将Name属性设置为const或readonly。私有集仍然允许名称在内部更改。
答案 6 :(得分:0)
您是说要在初始化的同时填充类?只需在构造函数中填充对象,如下所示:
class Test
{
public Test()
{
this.Name = "Hello World";
}
//if you need to pass information into the constructor:
public Test(string testName)
{
this.Name = testName;
}
}
然后,您可以执行此操作来初始化它:
Test test = new Test(); //default name of Hello World!
OR
Test test = new Test("Bingo!");