結構struct(值型別)在實際應用中應該注意的點
.Net中的資料型別大致可以分為二類:一類是值型別,一類是引用型別;結構(struct)是值型別,從效能上考慮值型別更有優勢(關於值型別與引用型別的詳細討論不在本文範圍內,大家可以去查閱相關資料).對於一些特定場合:比如僅需要儲存資料,不需要體現具體方法的時候,建議大家用struct來代替class,但在使用過程中,有幾個容易被忽視的細節.
1.使用struct儲存資料做為資料來源,與資料顯示控制元件繫結時:
程式碼如下:
Code
protected void Page_Load(object sender, EventArgs e)
{
List
_list.Add(new MyStruct3() { Name = "abc", Value = "123" });
_list.Add(new MyStruct3() { Name = "cde", Value = "345" });
this.Repeater1.DataSource = _list;
this.Repeater1.DataBind();
}
public struct MyStruct3
{
public string Name;
public string Value;
}
前端aspx關鍵程式碼:
Code
;
編譯時一切正常,但是執行後,報類似如下錯誤:
DataBinding:“Test._Default+MyStruct3”不包含名為“Name”的屬性
咋整?把MyStruct3的定義改成這樣:
Code
public struct MyStruct3
{
public string Name{set;get;}
public string Value { set; get; }
}
即:我們把欄位(Field)改成屬性(property),再次執行,一切OK (應該是跟採用反射機制有關)
2.結構的建構函式問題
看如下程式碼
Code
public struct MyStruct {
private string _name;
private string _value;
public string Name {
set { _name = value; }
get { return _name; }
}
public string Value
{
set { _value = value; }
get { return _value; }
}
public MyStruct(string pName, string pValue)
{
_name = pName;
_value = pValue;
}
}
一切跟在Class中寫的一樣,沒什麼特別的,但是我們改成下面的寫法:
Code
public struct MyStruct
{
public string Name { set; get; }
public string Value { set; get; }
public MyStruct(string pName, string pValue)
{
Name = pName;
Value = pValue;
}
}
即利用c#3.0的自動屬性,簡化了一下程式碼,這次編譯時vs卻提示有錯:
"錯誤 在控制返回到呼叫程式之前,自動實現的屬性“Test._Default.MyStruct2.Value”的支援欄位必須完全賦值。請考慮從建構函式初始值設定項中呼叫預設建構函式。 "
"在給“this”物件的所有欄位賦值之前,無法使用該物件"
究其原因,我們用Reflector看下編譯器是如何處理"自動屬性"的,先把結構改成普通的類(目的是讓編譯先透過,好觀察最終生成的程式碼
Code
public class MyClass
{
public string Name{set;get;}
public string Value { set; get; }
public MyClass(string pName, string pValue)
{
Name = pName;
Value = pValue;
}
}
用Reflector反編譯成C# 1.0後,程式碼如下:
Code
public class MyClass
{
// Fields
[CompilerGenerated]
private string
[CompilerGenerated]
private string
// Methods
public MyClass(string pName, string pValue)
{
base..ctor();
this.Name = pName;
this.Value = pValue;
return;
}
// Properties
public string Name
{
[CompilerGenerated]
get
{
string str;
str = this.
Label_0009:
return str;
}
[CompilerGenerated]
set
{
this.
return;
}
}
public string Value
{
[CompilerGenerated]
get
{
string str;
str = this.
Label_0009:
return str;
}
[CompilerGenerated]
set
{
this.
return;
}
}
}
觀察一下建構函式,變成了
...
base..ctor();
this.Name = pName;
...
關鍵就在這裡:對於類來講,並不要求在訪問類的例項之前對所有成員賦值,所以這裡引用this是合法的;而值型別要求在使用前必須對所有成員賦值,所以值型別如果在建構函式中直接給自動屬性賦值,這裡this代表的就是結構本身,而在此之前自動生成的二個私有成員private string
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/1020/viewspace-2808425/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Linux在實際中的應用Linux
- 自定義錯誤型別時應該注意的 nil !=nil型別
- golang什麼時候應該把方法繫結在struct的值上而不是指標上?GolangStruct指標
- 策略模式在實際業務中的應用模式
- 策略模式在業務中的實際應用模式
- 專案管理中,應該注意的5點原則專案管理
- OA系統在選型時應該注意的幾大要素?
- 關於CORS 應該注意的幾點CORS
- 策略模式解析以及在Android中的實際應用模式Android
- 並查集在實際問題中的應用並查集
- Nuxt配合Node在實際生產中的應用UX
- 在實際應用中聯合體union的妙用
- sklearn中的pipeline實際應用
- Google Guava 在實際場景中的應用封裝GoGuava封裝
- java高階用法之:JNA型別對映應該注意的問題Java型別
- vue中$set的使用(結合在實際應用中遇到的坑)Vue
- 【Go】那麼多數值型別,應該選哪個?Go型別
- 自學中應該注意的事項
- 雜湊資料結構以及在HashMap中的應用資料結構HashMap
- 自適應注意力機制在Image Caption中的應用APT
- 在選擇伺服器配置前,應該注意那幾點伺服器
- TypeScript 在開發應用中的實踐總結TypeScript
- 影片高防CDN你應該注意的幾點!
- Android架構系列-MVP架構的實際應用Android架構MVP
- 面試官:集合使用時應該注意哪些問題?我:應該注意該注意的問題!面試
- [Elasticsearch] ES 的Mapping 設計在實際場景中應用ElasticsearchAPP
- 多媒體互動在展覽展示中的應用型別型別
- 棧的實際應用
- 明確應用程式型別與資料庫結構設計型別資料庫
- Hibernate中@Struct註解型別Struct型別
- UI設計中色彩運用應該注意哪些問題UI
- 注意力機制在圖卷積中的應用卷積
- WuTongDB 特殊資料型別的實戰應用資料型別
- 樹結構的應用
- Redux的應該注意的問題Redux
- 策略模式在應用中的實踐模式
- 資料結構實驗:連結串列的應用資料結構
- 上海sap軟體供應商選擇應該注意的三個要點