2011-01-11 3 views
30

これらはPersonクラスの宣言です。C#Get/Set構文使用法

protected int ID { get; set; } 
protected string Title { get; set; } 
protected string Description { get; set; } 
protected TimeSpan jobLength { get; set; } 

get/setを使用するにはどうすればよいですか?メインでは、私はインスタンス化する

Person Tom = new Person(); 

どのようにTom.set/get?

私はint getAge()とvoid setAge()関数を書き出すだけのC++スタイルを使用しています。しかし、C#では、getとsetを処理するショートカットがありますか?あなたがそれらへのアクセスを持っていると仮定すると

+1

あなたはPersonクラス(および派生クラス)外部からのプロパティにアクセスすることはできません... [の –

+1

が重複する可能性が、これは何を意味するのでしょうか?パブリック名{get; set;}](http://stackoverflow.com/questions/1310223/what-does-this-mean-public-name-get-set) – nawfal

答えて

69

は(あなたが宣言したプロパティがprotectedある)、あなたはこのようにそれらを使用します。

Person tom = new Person(); 
tom.Title = "A title"; 
string hisTitle = tom.Title; 

これらはpropertiesです。基本的には、適切なメタデータを持つゲッター/セッターメソッドのペアです(ゲッターだけでもセッターもあります)。あなたが与えた例は、の自動的に実装されたプロパティです。ここでコンパイラはバッキングフィールドを追加しています。あなたは自分でコードを書くことができます。たとえば、あなたが宣言したTitleプロパティは、このようなものです:

private string title; // Backing field 
protected string Title 
{ 
    get { return title; } // Getter 
    set { title = value; } // Setter 
} 

...バッキングフィールドが「言いようのない名前」与えられていることを除いて - あなたのC#コードで参照することはできません1。あなたは、不動産そのものを通過することを強いられています。

プロパティの一部を他よりも制限することができます。たとえば、これは非常に一般的です:

private string foo; 
public string Foo 
{ 
    get { return foo; } 
    private set { foo = value; } 
} 

または自動的に実装プロパティとして:

ここ
public string Foo { get; private set; } 

「ゲッターは、」公共のですが、「セッターは」プライベートです。

+2

はい、しかし、それらは保護されていると宣言されているので、そのことはできません... –

+1

@トーマス:私たちがいるクラスに応じて...編集します。 –

+5

+1 "を除いて、バッキングフィールドには「言い分けられない名前」が与えられます。 Very Lovecraftian。 –

2

これらは、propertiesです。あなたはそのようにそれらを使用します。

Tom.Title = "Accountant"; 
string desc = Tom.Description; 

しかし、彼らは彼らの視認性が問題になる可能性がありprotected宣言され検討します。

+0

Personクラスのコードの外にある保護されたプロパティでは、これを行うことはできません。 – Nickolodeon

+0

派生クラスについて考える。そこにそれが可能でなければなりません。 ;-) – Offler

0

公開に設定します。つまり、あなたが「保護された」という言葉を持っている場合はどこにでも、それを「パブリック」という言葉に変えてください。アクセス制御が必要な場合は、「get」という単語または「set」という単語の前に、内部に配置します。

0

あなたはprotected意味としてそれらがマークされているとして、これらのプロパティにアクセスすることができません。

型またはメンバーは、同じクラスまたは構造体で、または派生したクラスにのみコードによってアクセスすることができますそのクラスから。

Person TOM=new Person 
{ 
    title = "My title", ID = 1 
}; 

しかし、再び、プロパティはパブリックである必要があります。C#3.5にあなたがそうのようなあなたのオブジェクトのプロパティをインスタンス化することができところで

1

、あなたは曲のクラスを持っていると仮定すると

+0

C#3またはC#3.0を意味します。 .NET 3.5はありますが、C#3.5はありません。 –

+0

私は.NET 3.5 – Nickolodeon

2

class Song 
    { 
     private String author_name; 
     public String setauthorname(String X) {}; //implementation goes here 
     public String getauthorname() {}; //implementation goes here 
    } 

を次のように(あなたは以下を参照することができます)、伝統的な実装は、このクラスの実装を検討し、のようになります。あなたの「メイン」クラスで

 class Song 
     { 
      private String author_name; 
      public String Author_Name 
      { 
       get { return author_name; } 
       set { author_name= value; } 
      } 
     } 

、あなたは

class TestSong 
    { 
     public static void Main(String[] Args) 
     { 
      Song _song = new Song(); //create an object for class 'Song'  
      _song.Author_Name = 'John Biley'; 
      String author = _song.Author_Name;   
      Console.WriteLine("Authorname = {0}"+author); 
     } 
    } 

ポイントに注意するようにコードを書いてます。

設定する/取得する方法は、公開または保護されている(注意してください)が、厳密にはプライベートではいけません。私はこれが不明であるかを理解していない

0

プロパティは、読み取り、書き込み、またはプライベートフィールドの値を計算するための柔軟なメカニズムを提供するメンバーです。プロパティはパブリックデータメンバであるかのように使用できますが、実際にはアクセサと呼ばれる特別なメソッドです。これは、データのアクセスを容易にしながら、安全性と柔軟性を提供します。

この例では、クラスTimePeriodには期間が格納されています。内部的にクラスには秒単位の時間が格納されますが、Hoursというプロパティーが用意されているため、クライアントは時間を時間単位で指定できます。 Hoursプロパティのアクセサーは、数時間から数秒の間の変換を実行します。実装や検証コードを隠しながら

class TimePeriod 
{ 
    private double seconds; 

    public double Hours 
    { 
     get { return seconds/3600; } 
     set { seconds = value * 3600; } 
    } 
} 

class Program 
{ 
    static void Main() 
    { 
     TimePeriod t = new TimePeriod(); 

     // Assigning the Hours property causes the 'set' accessor to be called. 
     t.Hours = 24; 

     // Evaluating the Hours property causes the 'get' accessor to be called. 
     System.Console.WriteLine("Time in hours: " + t.Hours); 
    } 
} 

プロパティの概要

プロパティは、値を取得および設定の公開方法を公開するクラスを有効にします。

取得プロパティアクセサは、プロパティの値を返すために使用され、セットアクセサは、新しい値を割り当てるために使用されます。これらのアクセサは、異なるアクセスレベルを持つことができます。

valueキーワードは、set indexerによって割り当てられる値を定義するために使用されます。

setメソッドを実装していないプロパティは読み取り専用です。

http://msdn.microsoft.com/en-US/library/x9fsa0sw%28v=vs.80%29.aspx

保護としてあなたがそれらを宣言した場合