11

私はこのようなタイプの保険である保険と呼ばれるフィールドを持つ従業員と呼ばれるクラスを持っています

public class Employee
{
    public string Name;
    public Insurance Insurance;
}

私は保険という別のクラスを持っています

public class Insurance
{
    public int PolicyId;
    public String PolicyName;
} 

メインプログラムで、次のようなことをしたい

var myEmployee = new Employee();
myEmployee.Name = "Jhon";
myEmployee.Insurance.PolicyId = 123 ;
myEmployee.Insurance.PolicyName = "Life Time" ;

C# が不平を言っていますが、Insurance クラスのインスタンスを作成して修正する方法を知っています。

私の質問は、メインプログラムで好きなようにフィールドに値を割り当てることができるかということです

**

myEmployee.Insurance.PolicyId = 123 ;
myEmployee.Insurance.PolicyName = "Life Time" ;

** 私は試した

 public class Employee
    {

        public Employee()
        {
            Insurance Insurance = new Insurance();
        }

        public String Name;
        public Insurance Insurance;



        public class Insurance
        {
            public int PolicyId;
            public String PolicyName;
        } 
    }

私が試したときのメインメソッドで

class Program
    {
        static void Main(string[] args)
        {
            var joe = new Employee();
            joe.Name = "Joe";
            joe.Insurance.

        }

このエラーが発生します-

エラー 2 「ConsoleApplication1.Employee.Insurance」と「ConsoleApplication1.Employee.Insurance」のあいまいさ c:\users\lenovo\documents\visual studio 2012\Projects\ConsoleApplication1\ConsoleApplication1\Program.cs 15 17 ConsoleApplication1

4

4 に答える 4

16

Employee のコンストラクターで Insurance をインスタンス化すると、自動的に実行されます。後でアクセスしたときに有効であるとまだ定義されていないことが理解されるように、デフォルト値を指定できます。

public class Employee
{
    Insurance Insurance { get; set; }

    public Employee()
    {
        this.Insurance = new Insurance() { PolicyId = -1 };
    }
}

public class Insurance
{
    public int PolicyId { get; set; }
    public string PolicyName { get; set; }
}

または、クラスをネストしたままにするには:

public class Employee
{
    Insurance InsurancePolicy { get; set; }

    public Employee()
    {
        this.InsurancePolicy = new Insurance() { PolicyId = -1 };
    }
    public class Insurance
    {
        public int PolicyId { get; set; }
        public string PolicyName { get; set; }
    }
}
于 2013-08-08T18:32:27.000 に答える
12

クラスを変更しなくてEmployeeも、オブジェクト初期化子を使用できます。

var myEmployee = new Employee 
{
    Name = "Jhon",
    Insurance = new Insurance
    {
        PolicyId = 123,
        PolicyName = "Life Time"
    }
};

あるいは、おそらくできれば、Employeeクラスにコンストラクターで新しいインスタンスを作成させることができますInsurance(他の回答のように)。または、Insuranceプロパティゲッター自体でそれを行う別のオプションがあるため、使用する場合にのみインスタンス化されます。それ。後者の例を次に示します。

class Employee 
{
    private Insurance insurance;

    public Insurance Insurance
    {
        get
        {
            if (insurance == null)
            {
                insurance = new Insurance();
            }
            return insurance;
        }
    }
}

最後に、すべての public フィールドを持つクラスを作成しないことをお勧めします。代わりに、フィールドよりもプロパティを使用することを検討します。他の提案を次のコードに組み込み、独自のものを提供しました。

public class Employee
{
    public Employee() 
    {
        this.Insurance = new Insurance();
    }

    // Perhaps another constructor for the name?
    public Employee(string name)
        : this()
    {
        this.Name = name;
    }

    public string Name { get; set; }
    public Insurance Insurance { get; private set; }
}

public class Insurance
{
    public int PolicyId { get; set; }
    public string PolicyName { get; set; }
}
于 2013-08-08T18:30:52.287 に答える
6

もちろんですが、nullオブジェクトに属するものをどのように割り当てるのでしょうか? のコンストラクターInsuranceでインスタンス化する必要があります。Employee

public Employee()
{
     this.Insurance = new Insurance();
}

EDITコメントについて:このアプローチに従うと、2つのドットでアクセスできます。コンストラクターはEmployee のクラスにあるため、一度実装すると、既に実行しようとしたこと以外に何も入力する必要はありません。myEmplyee.Insurance.PolicyID

于 2013-08-08T18:31:07.697 に答える
1

インスタンス化する従業員のコンストラクターを作成できますInsurance

public class Employee
{
    public Employee()
    {
        this.Insurance = new Insurance();
    }
    public string Name;
    public Insurance Insurance;
}
于 2013-08-08T18:31:49.050 に答える