簡體   English   中英

了解C#屬性的語法和getter / setter

[英]Understanding C# property syntax and getters/setters

我來自Java世界,這種構造使我發瘋:

    private static string _muiUrl;

    private static string MUIUrl
    {
        get
        {
            if (String.IsNullOrEmpty(_muiUrl))
            {
                using (var db = new IntLMPDB())
                {
                    _muiUrl =
                        (from c in db.Control where c.ControlKey == "MUI_Url" select c.ControlValue).FirstOrDefault();
                }
            }
            return _muiUrl;
        }
    }

當我在類中看到該屬性並想在該類本身中使用該屬性時,應該如何調用它?

簡單如下:

var result = TypeWithMUIURLProperty.MUIUrl;

可以忽略其他人提到的類名,但是為了清楚起見,在本示例中將其保留。

在類內部,您完全不需要限定屬性名稱,即您只需編寫

string url = MUIUrl;

如果該屬性比private屬性更“好”,則可以從完全不同的類訪問該屬性,則需要使用類名稱對其進行限定(但是即使在該類內部也可以使用它,但這不是必需的) ,即

string url = ThatClassYouDidNotName.MUIUrl;

(旁注:這種延遲初始化的變體通常不是線程安全的。)

從班級內部,只需編寫MUIUrl就可以了。 那會拉一個初始化的值,並強制延遲實例化。

如果它是公共的,並且您正在其他地方訪問它,則需要編寫YourClassName.MUIUrl 但是由於它是私有的,所以這是不必要的。

同樣,只需使用MUIUrl就可以在實例或其他靜態成員中使用。

當我實現具有私有后備存儲的自加載屬性時,我遵循以下約定:從不與后備存儲交互,始終從該屬性讀取。

我覺得您需要私有字段很愚蠢,我覺得這種類型的代碼應該繼承{get; set;} {get; set;} ,則無論您是直接使用屬性還是使用默認的自動屬性連線,都應該隱式訪問屬性類型的字段。

如果這個構造使您發瘋,請在此處進行一些解釋作為注釋

private static string _muiUrl;
public static string MUIUrl
{
    get
    {
        //if the variable is null or empty
        if (String.IsNullOrEmpty(_muiUrl))
        {
            //using defines a scope, outside of which an object or objects will be disposed.
            //http://msdn.microsoft.com/en-us/library/yh598w02(v=vs.80).aspx
            using (var db = new IntLMPDB())
            {
                //this is linq
                //a simple example will be 
                //http://stackoverflow.com/questions/214500/which-linq-syntax-do-you-prefer-fluent-or-query-expression
                _muiUrl = (from c in db.Control 
                            where c.ControlKey == "MUI_Url" 
                            select c.ControlValue
                          ).FirstOrDefault();
                //or another linq syntax will be
                //_muiUrl= db.Control
                //        .Where(c => c.ControlKey == "MUI_Url")
                //        .FirstOrDefault()
                //        .ControlValue;
            }
        }
        return _muiUrl;
    }
}

自從您在類外調用該屬性以來,就故意將其訪問修飾符設置為公共屬性(如果需要,可以將其私有化)。

現在稱它為

ClassName.MUIUrl

暫無
暫無

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

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