創建預初始化類的最佳做法是什麼?例如C#預初始化類
Chip chip = new Atmega8();
我想有它的屬性已經定義,如:
chip.Name = "Atmega8 AVR Chip";
等。
如何在C#中實現它?
我應該使用readonly public
屬性或屬性private set
?
創建預初始化類的最佳做法是什麼?例如C#預初始化類
Chip chip = new Atmega8();
我想有它的屬性已經定義,如:
chip.Name = "Atmega8 AVR Chip";
等。
如何在C#中實現它?
我應該使用readonly public
屬性或屬性private set
?
有構造函數初始化值:
class Atmega8 {
public Atmega8()
{
Name = "Atmega8 AVR Chip";
}
public string Name { get; set; }
}
如果您打算Name
成爲所有實例一樣,它可能是有意義的在基類中聲明它abstract
並覆蓋吸氣:
abstract class Chip {
public abstract string Name { get; }
}
class Atmega8 : Chip {
public override string Name {
get { return "Atmega8 AVR Chip"; }
}
}
因爲我們還沒有定義的set
方法,該值不能被改變,非常像readonly
v可愛的,除了它甚至不存儲在任何地方,並在每次通話中返回。
取決於你想完成什麼。
它看起來像你永遠不想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);
}
}
屬性值不能更改 - >只讀公共屬性。
的屬性值可以改變 - >物業與private set
如果你不想讓它改變,使Name屬性常量或只讀於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!
OR
Test test = new Test("Bingo!");
在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";
}
如果你希望編譯器來執行,沒有什麼可以改變一次初始化的字段的值,然後將其設置爲只讀域,在類的構造函數來填充它(或簡單地初始化但是當你聲明它的時候,雖然這並不能很好地繼承)。如果你不關心,只要對象之外沒有東西可以改變它(意味着你會相信自己的編碼規則以確保它不會在內部發生變化),帶有後臺字段的只讀屬性或自動屬性與私人二傳手,是你的賭注。
如果你絕對後果不要想要改變某個特定類的值,那麼我會使它成爲一個返回字符串常量或常量的只讀屬性。我建議在字面上使用常量,因爲你可以將常量放入它們自己的靜態類中,然後可以從每個Chip類單獨使用它們。
然而,你應該知道一個常數的怪癖。 .NET中的常量值不僅存儲在包含聲明代碼的程序集的清單中,而且還存儲在引用聲明程序集的每個程序集的清單中。每個程序集的代碼使用它自己清單中的值。因此,如果常量值EVER發生變化,則必須重新編譯引用聲明程序集的任何程序集以使用新值更新這些程序集的清單。否則,常量只有在聲明程序集中使用時纔會有新值。出於這個原因,將變量標記爲常量不應該輕易做到。就我個人而言,我的觀點是,如果常數不是宇宙的持續存在和功能所依賴的某種價值,如pi,e,真空中的光速,普朗克常數,阿伏加德羅數等,那麼它就不是「 t「常量」。其他任何東西,比如通信代碼序號,都可以改變,即使這樣做會破壞程序的每個以前版本的兼容性。
+1:關於常量的好點和很好的警告! – IAbstract
+1,但是你需要認真思考是否應該將數學/物理常數聲明爲「const」。如果有一天你決定你的'pi'常數應該是3.141592654而不是普通的3.14?我嘗試只爲*(1)*局部和私有字段使用'const',在那裏並不重要,如果該值永遠不是真正的常量,並且*(2)*值總是爲真*由定義*;例如'public const int CentimetersInOneMeter = 100;'。 – LukeH
那麼,如果我打算將pi定義爲一個常量,那麼它的精確度應該與我選擇的數字類型一樣多;至少您的9位小數位。 E,同樣的事情。 – KeithS
我會警告不要使用常量,因爲它們也被編譯到所有的引用程序集中;如果該值由其他程序集中的對象使用,則readonly字段或屬性會更好。 – KeithS