Существует ли синтаксический сахарный синтаксис свойства C # для создания экземпляров универсальных коллекций? - PullRequest
2 голосов
/ 01 декабря 2009

Следующая программа не будет выполнена, поскольку Контракты не созданы.

Конечно, я могу создать его экземпляр в моем конструкторе , но если у меня есть десятки свойств и / или несколько конструкторов, я должен отслеживать, какие из них созданы и т. Д.

И, конечно, я мог бы создать большие блоки для этих свойств с full, получает и устанавливает и переменные закрытого поля и т. Д. Но это также беспорядочно.

Нет ли способа автоматически создать экземпляры этих коллекций с помощью синтаксиса свойства C #?

using System;
using System.Collections.Generic;

namespace TestProperty232
{
    class Program
    {
        static void Main(string[] args)
        {
            Customer customer = new Customer();
            customer.FirstName = "Jim";
            customer.LastName = "Smith";

            Contract contract = new Contract();
            contract.Title = "First Contract";

            customer.Contracts.Add(contract);

            Console.ReadLine();
        }
    }

    public class Customer
    {
        public string FirstName { get; set; }
        public string LastName { get; set; }
        public List<Contract> Contracts { get; set; }

        public Customer()
        {
            //Contracts = new List<Contract>();
        }
    }

    public class Contract
    {
        public string Title { get; set; }
    }
}

Ответы [ 7 ]

6 голосов
/ 01 декабря 2009

Нет такого синтаксического сахара, но я бы хотел отметить несколько вещей:

  • Свойства коллекции должны быть доступны только для чтения в любом случае.
  • Если у вас много таких свойств в одном типе, это сильный признак того, что вы нарушаете принцип единой ответственности
  • Если у вас есть несколько конструкторов, вы всегда должны позаботиться о том, чтобы только один конструктор выполнял реальную работу, а все другие конструкторы делегировали этому конструктору. В качестве альтернативы вы можете делегировать всю работу конструктора частному методу Initialize.
5 голосов
/ 01 декабря 2009

Нет, сахара нет. Создайте их в своем конструкторе без параметров и перенаправьте туда все остальные ваши конструкторы, чтобы он всегда выполнялся.

class MyClass
{
    //Many properties

    public MyClass()
    {
        //Initialize here
    }

    public MyClass(string str) : this()
    {
        //do other stuff here
    }
}
1 голос
/ 01 декабря 2009

Sugary или lemony: вы решаете: (VS 2010 beta 2, FrameWork 4)

    Customer customer = new Customer
    {
        FirstName = "Jim", 
        LastName = "Smith", 
        Contracts = new List<Contract> { new Contract { Title ="First Contract" } }
    };

Хорошо работает с вашими существующими определениями классов, но читать неловко?

лучший

1 голос
/ 01 декабря 2009

Длинный ответ: как это?

using System.Collections.Generic;

namespace proto
{
    public class Customer
    {
        public string FirstName { get; set; }

        public string LastName { get; set; }

    }

    public class Contract
    {
        public List<Customer> Customers { get; set; }

        public string Title { get; set; }
    }

    public class ContractDemo
    {
        public Contract CreateDemoContract()
        {
            Contract newContract = new Contract
            {
                Title = "Contract Title", 
                Customers = new List<Customer>
                {
                    new Customer
                    {
                        FirstName = "First Name",
                        LastName = "Last Name"
                    },
                    new Customer
                    {
                        FirstName = "Other",
                        LastName = "Customer"
                    }
                }
            };

            return newContract;
        }

    }
}
0 голосов
/ 01 декабря 2009

Вы можете сделать Контракты не являющимися автоматическими объектами:

private List<Contract> _contracts;
public List<Contract> Contracts
{
    get
    {
        if (_contracts == null)
        {
            _contracts = new List<Contract>();
        }
        return _contracts;
    }
    set
    {
        if (!_contracts.Equals(value))
        {
            _contracts = value;
        }
    }
}

Это позволит вам не создавать явные экземпляры Контрактов.

0 голосов
/ 01 декабря 2009

Не уверен, что вы на самом деле ищете, но вы можете привести в порядок немного вот так ...

using System;
using System.Collections.Generic;

namespace TestProperty232
{
    class Program
    {
        static void Main(string[] args)
        {
            Customer customer = new Customer() { 
                FirstName = "Jim",
                LastName = "Smith"
            };

            Contract contract = new Contract() { 
                Title = "First Contract"
            };

            customer.Contracts = new List<Contract>() { contract };

            Console.ReadLine();
        }
    }

    public class Customer
    {
        public string FirstName { get; set; }
        public string LastName { get; set; }
        public List<Contract> Contracts { get; set; }

        public Customer()
        {
            //Contracts = new List<Contract>();
        }
    }

    public class Contract
    {
        public string Title { get; set; }
    }
}
0 голосов
/ 01 декабря 2009

Краткий ответ: нет .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...