2012-05-10 143 views
1

我創建了一個名爲ProfileHelper的類,並且我似乎無法讓我的get/set訪問器正確;相反,我在get和set上都得到了紅線。以下是我嘗試使用的代碼:get/set訪問器的正確範圍

public static String UserName(string columnName) 
{ 
    get 
    { 
     using (SqlConnection cn = new SqlConnection(SiteConfig.ConnectionString)) 
     { 
      string sSql = ("SELECT UserName , LoweredUserName FROM aspnet_Users WHERE UserId = @UserId"); 

      using (SqlCommand cm = new SqlCommand(sSql, cn)) 
      { 
       cm.Parameters.AddWithValue("@UserId", Membership.GetUser().ProviderUserKey.ToString()); 
       cn.Open(); 
       using (SqlDataReader rd = cm.ExecuteReader()) 
       { 
        while (rd.Read()) 
        { 
         return columnName; 
        } 
        rd.Close(); 
       } 
       cn.Close(); 
      }   
     }    
     return columnName; 
    } 
    set 
    { 
     using (SqlConnection cn = new SqlConnection(SiteConfig.ConnectionString)) 
     { 
      string sSql = ("UPDATE [aspnet_ Users] SET UserName = @UserName, LoweredUserName = @LoweredUserName WHERE UserId = @UserId"); 

      using (SqlCommand cm = new SqlCommand(sSql, cn)) 
      { 
       cm.Parameters.AddWithValue("@UserId", Membership.GetUser().ProviderUserKey.ToString()); 
       cn.Open(); 
       cm.ExecuteNonQuery(); 
       cn.Close(); 
      }  
     } 
    } 
} 
+4

請修改您的帖子,而不是將代碼放入您的評論。還提供更多信息。你有什麼錯誤,你有什麼嘗試。 – TJHeuvel

+8

屬性不應該訪問數據庫。他們應該很簡單 - 做很少的工作。 – Oded

+1

你真的不應該在你的getter和setter中做這麼多工作。 – CodeCaster

回答

7

語法基本上是:

private string userName; 
public string UserName // no parameter here! 
{ 
    get { return this.userName; } 
    set { this.userName = value; } // value is a keyword 
} 

另外,自動屬性爲你做後盾領域:

public string UserName { get; set; } // equivalent 
public string MyExternallyReadOnly { get; private set; } // setter is private 

你應該與性能SQL連接反覆折騰。獲得物業應該是快速和可靠的。考慮方法代替它,使之清楚,這實際上是與外部依賴性更長的持久的作用(這是失敗的可能性較大):

public string GetUserName() { } 
public void UpdateUserName() {} 
+0

我會在哪裏使用這種方法?在我的profileHelper類中? – blanket

+0

無論你在哪裏使用'UserName'屬性。我編輯了我的答案,我希望現在更清楚。 –

+0

是的,這很清楚,另一方面,我需要使用助手類在我的個人資料頁中調用方法,其中我使用選擇和更新查詢創建了一個名爲Public Static String username(string ColumnName){}的方法。我不明白我是如何使用get/set和在哪裏? – blanket

8

這是一種方法,而不是屬性。只有屬性具有get和set訪問器。選一個。

public static String UserName(string columnName) // this implies a method 
    { 
     get // this implies a property 
     { 
+0

當然,如果他想要單獨的getter和setter代碼,並且如果他仍然需要參數'columnName',他可以編寫一個索引器。索引器就像一個屬性,但它可能需要一個或多個參數。 (當然,setter有一個額外的「不可見」參數value。)不是我在這種情況下建議使用索引器,但它肯定是方法和屬性之間的一種混合。 –

2

你應該做一方法,GetUserName(string columnName)SetUserName(string columnName, string value)。這是可能需要一段時間的首選方法,例如因爲你正在建立一個數據庫連接,並且可以讓你輕鬆地擁有一個參數。

public static String UserName(string columnName)是方法的簽名。 public static String UserName將是一個財產。屬性具有get/set訪問器,方法不具有。你需要改變這一點。屬性不允許參數,但indexed properties不能爲靜態(例如,使用類似myObj[someColumnName],聲明如public string this[string columnName])。如果您希望訪問諸如var something = ProfileHelper.UserName;之類的資產,請使用屬性。