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=100public Atmega8() {
    Name = "Atmega8 AVR Chip";
}
private readonly string _Name = string.Empty;

public string Name {
    get { return _name; }
}

public Atmega8() {
    _Name = "Atmega8 AVR Chip";
}