簡體   English   中英

公共屬性,而不是PRIVATE字段

[英]Public Properties instead of PRIVATE fields

首先我只想澄清,避免不必要的重復標記,這個問題不是一個重復的這一個 ,既不重復這另外一個我已經搜查或他人。 為什么? 他們都使用經典C#的“屬性”談論公共領域或私有領域。

我的問題是為什么我應該寫這樣的東西( 公共屬性

class myClass{

public int AValue{get; set;}
}

當我可以改寫時( 不涉及任何屬性的 私有字段 )(只是經典的舊C ++風格的編寫方式)

class myClass{
private int aValue;
public int getValue{ return aValue;}
public void setValue(int value){ aValue=value;}

我撓頭,閱讀許多資源,答案和問題,但沒有人回答這個問題。 他們都在談論相對於公共字段的優勢(這不是我要問的),或者是關於新自動屬性相對於舊屬性的好處(我也沒有問過)。

我想我的問題是,為什么C#沒有使用在Java或C ++中運行良好的相同編寫方式。 我看不出任何優勢。 我非常感謝有人教給我這個好處,因為afaik不在其他地方寫過。 (甚至不在我的C#書籍中)

根據我的理解,您所指的公共屬性僅僅是封裝了您上面描述的模式的語法糖。

我認為這取決於可讀性和平台標准。 盡管您所談論的方式沒有錯,但我們還需要考慮可維護性。 對於另一位.Net開發人員而言,該模式不適合他們慣常使用的模式,並可能引起混亂。

這是膚淺的原因,只是編寫了很多代碼。 尤其是當您有DTO之類的東西時。

c#中的屬性被進一步封裝,並最終轉換為專用字段的中間語言和相應的Get Set方法,因此您不必打擾

為此,自動訪問器是語法糖。 生成的代碼具有一個后備字段和get / set方法。 字段沒有訪問器,而屬性卻有。

公共/私有是關於封裝/安全性,即誰應該能夠訪問您的信息。

用您介紹它的方式(編寫getset方法)是好的,但是您有兩種方法-一種用於設置字段的值,另一種用於獲取該值。 使用屬性對我來說更自然,因為用一個名稱“封裝” setget方法並以這種方式訪問​​它更好(我認為)。

使用public int AValue { get; set; }主要原因 public int AValue { get; set; } public int AValue { get; set; }而不是私有字段和一對getAValuesetAValue函數,這就是在C#中完成事情的方式。 從“代碼在運行時的工作方式”的角度來看,這兩者與“自動屬性”(使編譯器負責生成私有支持字段的屬性類型)幾乎相同轉換成與您編寫的代碼非常相似的代碼(有關示例,請參見此stackoverflow問題接受的答案 )。

問題中的主要“優勢”(為什么使用屬性而不是字段和獲取/設置方法對)是可預測性和可理解性。 使用您的代碼的任何人都希望看到屬性,而不是私有字段/獲取/設置實現,因此您的代碼將更容易理解。 看到它的實現方式不同,將使他們產生疑問, 為什么要這樣做,並認為這是有原因的,因此在理解您的代碼時會使它們變慢。

C#的getter和setter是語法糖,它刪除了嘈雜的方法名稱( SetValueGetValueSetValue Value )並提高了代碼的可讀性。

在使用代碼時,可讀性要好得多

// Without properties
var myClass = new MyClass();
myClass.SetAValue(aValue);
myClass.SetBValue(bValue);

//And with properties
var myClass = new MyClass 
{
    AValue = aValue,
    BValue = bValue
}

因為它只是語法糖,所以每個開發人員/團隊都可以隨意使用它。
一些團隊有“規則”,即屬性只能用於獲取/設置值,而在獲取器/設置器中沒有任何“繁瑣”的邏輯。 並且應該使用方法來設置或獲取執行某些“繁重”操作的值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM