2011-02-05 35 views
1

我想定義一個變量來存儲兩個參數 - 用戶名和訪問級別。爲了做到這一點,我選擇使用結構,我在App.cs文件中聲明瞭該結構,並從成功授權中填充的這種結構類型中變量。定義私有/公共類型的結構

下面是一些代碼示例:

struct AuthSession 
{ 
    string username; 
    string accessLevel; 
} 

public AuthSession userSession; 

重要!變量userSession必須可以從/到所有類訪問,以便提供每次檢查用戶會話並在每個需要的地方進行檢查的能力。

我的問題是:

  1. 我應該在結構定義類型private/public?例如。 public struct AuthSessionstruct AuthSession

  2. 如果我在結構體定義中沒有鍵入private/public它是否默認設置了一些封裝級別?

+3

爲什麼一個結構?聲明一個結構是非常罕見的,並且大部分時間都是錯誤的。這看起來不像一個有效的結構的典型場景... – 2011-02-05 17:51:17

+2

換句話說:如果你不能說明爲什麼它應該是一個結構的非常明確的原因,那麼它幾乎肯定不應該是。 – 2011-02-05 17:52:15

回答

3

默認情況下,如果你不上一個頂級類指定可見性改性劑/結構它被認爲是internal。嵌套類/結構默認爲私有。

  • struct AuthSession裝置內部即,僅在聲明它的組件內部是可見的。
  • public struct AuthSession意味着公共即可從其他組件訪問。

請注意,這與結構字段(usernameaccessLevel)不相同。如果您沒有爲它們指定可見性修飾符,則它們是private

+1

稍作澄清:頂層類型默認爲內部;嵌套類型默認爲私有 – 2011-02-05 17:54:13

2

你是肯定你想要一個結構?如果你想在狀態中存儲狀態並傳遞它並用值填充它,你可能會對行爲感到驚訝。我建議使用類來代替。

請看下面的例子:

class Program 
    { 
     struct AuthSession 
     { 
      public string username; 
      public string accessLevel; 
     } 

     class AuthSession2 
     { 
      public string Username { get; set; } 
      public string AccessLevel { get; set; } 
     } 

     static void Main(string[] args) 
     { 
      AuthSession session = new AuthSession(); 
      AuthSession2 session2 = new AuthSession2(); 

      DoStuff(session); 
      DoStuff(session2); 

      Console.WriteLine(session.username + " " + session.accessLevel); 
      Console.WriteLine(session2.Username + " " + session2.AccessLevel); 
     } 

     static void DoStuff(AuthSession session) 
     { 
      session.username = "a"; 
      session.accessLevel = "a"; 
     } 

     static void DoStuff(AuthSession2 session) 
     { 
      session.Username = "a"; 
      session.AccessLevel = "a"; 
     } 
    } 

如果運行這個例子中你會注意到的主要方法只對類AuthSession2值,的結構。

難道是想要嗎?