C#pre初始化类

时间:2011-08-09 16:38:11

标签: c# class conventions

创建预初始化类的最佳做法是什么。例如

Chip chip = new Atmega8();

我想将其属性定义为:

chip.Name = "Atmega8 AVR Chip";

等等。

如何在C#中实现它?
我应该将readonly public属性或属性与private set一起使用吗?

7 个答案:

答案 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!");