C#预初始化类
创建预初始化类的最佳实践是什么。比如说C#预初始化类,c#,class,conventions,C#,Class,Conventions,创建预初始化类的最佳实践是什么。比如说 Chip chip = new Atmega8(); 我希望其属性已定义为: chip.Name = "Atmega8 AVR Chip"; 等等 如何在C#中实现它? 我应该使用只读公共属性还是带有私有集的属性?取决于您想要完成的任务 看起来您永远不希望更改Name的值。一种方法是在Chip中将Name声明为abstract,并在每个子类中实现Name,以返回一个常量字符串值 abstract class Chip { public abst
Chip chip = new Atmega8();
我希望其属性已定义为:
chip.Name = "Atmega8 AVR Chip";
等等
如何在C#中实现它?我应该使用
只读公共
属性还是带有私有集的属性
?取决于您想要完成的任务
看起来您永远不希望更改Name
的值。一种方法是在Chip
中将Name
声明为abstract
,并在每个子类中实现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);
}
}
让构造函数初始化值:
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
变量一样,只是它甚至不存储在任何地方,每次调用时都返回。属性值不能更改->只读公共属性
属性值可以更改->属性设置为
私有集
如果不想更改,请在Atmega8类中将名称属性设置为常量或只读。私有集仍然允许名称在内部更改 您是说希望在初始化类的同时填充该类?只需在构造函数中填充对象,如下所示:
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!
或
在Atmega8类的构造函数中,可以将属性设置为某个值。即:
public Atmega8() {
Name = "Atmega8 AVR Chip";
}
如果不希望在运行时更改该属性,可以将该属性标记为只读(仅可通过声明性构造函数进行赋值)
如果您希望编译器强制执行初始化后字段的值不能更改,那么将其设置为只读字段,并将其填充到类的构造函数中(或者在声明它时简单地初始化它;但这在继承中不太好)。如果您不在乎,只要对象外部没有任何东西可以更改它(这意味着您将信任自己的编码规则,以确保它不会在内部更改),那么您可以选择带有支持字段的get only属性,或者带有私有setter的auto属性 如果您绝对不希望某个特定类的值发生更改,那么我会将其设置为只返回字符串文字或常量的get属性。我建议使用常量而不是文字,因为您可以将常量放入它们自己的静态类中,然后可以从每个芯片类中单独使用
然而,有一个奇怪的常数你应该知道。NET中的常量值不仅存储在包含声明代码的程序集的清单中,而且存储在引用声明程序集的每个程序集中。每个程序集的代码使用其自身清单中的值。因此,如果常量值发生更改,则必须重新编译引用声明程序集的任何程序集,以使用新值更新这些程序集的清单。否则,该常量只有在声明程序集中使用时才具有其新值。因此,不应轻易地将变量标记为常量。我个人认为,如果常数不是宇宙持续存在和运行所依赖的某个值,比如π,e,真空中的光速,普朗克常数,阿伏伽德罗数等等,那么它就不是“常数”。其他任何东西,如通信代码序号,都可以更改,即使这样做会破坏与您的程序的所有以前版本的兼容性。我要警告不要使用常量,因为它们也会编译到所有引用程序集中;如果值由其他程序集中的对象使用,则只读字段或属性会更好。+1,但您甚至需要仔细考虑是否应将数学/物理常量声明为
const
。如果有一天你决定你的pi
常数应该是3.141592654,而不是普通的3.14呢?我尝试只对(1)局部变量和私有字段使用const
,如果值不是永久不变的,则无所谓;(2)定义为始终为真的值;例如,public const int-centomsinonemeter=100好吧,如果我将pi定义为一个常数,它的精度将与我选择的数值类型中的精度一样高;至少保留小数点后9位。E、 同样的事情。
public Atmega8() {
Name = "Atmega8 AVR Chip";
}
private readonly string _Name = string.Empty;
public string Name {
get { return _name; }
}
public Atmega8() {
_Name = "Atmega8 AVR Chip";
}