web-dev-qa-db-ja.com

C#Get / Set構文の使用法

これらはPersonクラスの宣言です。

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を処理するショートカットがありますか?

32
RoR

それらにアクセスできると仮定すると(宣言したプロパティは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#コードで参照できない名前です。プロパティ自体を通過する必要があります。

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

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

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

public string Foo { get; private set; }

ここでは、「getter」はパブリックですが、「setter」はプライベートです。

72
Jon Skeet

歌のクラスがあると仮定すると(以下を参照できます)、従来の実装は次のようになります。

 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);
      }
    }

注意すべき点;

設定/取得するメソッドはパブリックまたは保護(注意)する必要がありますが、厳密にプライベートにすることはできません。

これらは プロパティ です。次のように使用します。

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

しかし、それらがprotectedと宣言されていることを考慮すると、それらの可視性が問題になるかもしれません。

2
Gavin H

ところで、C#3.5では、次のようにオブジェクトのプロパティをインスタンス化できます。

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

ただし、プロパティはパブリックでなければなりません。

1
Nickolodeon

これが何であるかわからない

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

この例では、クラス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);
    }
}

プロパティの概要

プロパティを使用すると、クラスは実装または検証コードを非表示にしつつ、値を取得および設定するパブリックな方法を公開できます。

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

Valueキーワードは、セットインデクサーによって割り当てられる値を定義するために使用されます。

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

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

0
Ivan

それらを公開に設定します。つまり、「保護された」という言葉があるところはどこでも、「公共」という言葉に変更します。アクセス制御が必要な場合は、Wordの「get」または「set」の前にアクセス制御を配置します。

0
GWLlosa

protected の意味があるため、これらのプロパティにアクセスすることはできません。

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

0
Anders Arpi