Каково различие между объектным инициализатором и конструктором?

Вы можете использовать некоторые JavaScript для достижения этой цели. Смотрите рабочий фрагмент:

.inp {
    border: 1px solid black;
    text-align: center;
    outline: none;
    min-width:2px;
}
span {
    display: inline-block;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.1.0/jquery.min.js"></script>
<span>Estimated completion:</span>

<span> <input class="inp" type="text" onkeypress="this.style.width = (this.value.length + 1) + 'ch';"></span>
   

<span> Hours.</span>

В качестве альтернативы вы можете использовать только диапазон с contenteditable="true"

163
задан nawfal 31 May 2013 в 05:53
поделиться

6 ответов

Инициализаторы объектов были добавлены в C # 3, чтобы упростить построение объектов при использовании объекта.

Конструкторы запускаются с заданным 0 или более параметрами и используются для создания и инициализации объекта до вызывающего метода, который получает дескриптор созданного объекта. Например:

MyObject myObjectInstance = new MyObject(param1, param2);

В этом случае конструктор MyObject будет работать со значениями param1 и param2 . Оба они используются для создания нового MyObject в памяти. Созданный объект (который настраивается с использованием этих параметров) возвращается и устанавливается равным myObjectInstance .

В целом считается хорошей практикой иметь конструктор, требующий параметры, необходимые для полной настройки объекта. так, чтобы это Невозможно создать объект в недопустимом состоянии.

Однако часто существуют «дополнительные» свойства, которые можно установить, но они не обязательны. Это может быть обработано через перегруженные конструкторы, но приводит к наличию множества конструкторов, которые не всегда полезны в большинстве случаев.

Это приводит к инициализаторам объекта - Инициализатор объекта позволяет вам устанавливать свойства или поля вашего объекта после он был построен, но до вы можете использовать его любым другим способом. Например:

MyObject myObjectInstance = new MyObject(param1, param2)
{
    MyProperty = someUsefulValue
};

Это будет вести себя примерно так же, как если бы вы это делали:

MyObject myObjectInstance = new MyObject(param1, param2);
myObjectInstance.MyProperty = someUsefulValue;

Однако в многопоточных средах атомарность инициализатора объекта может быть полезной,

227
ответ дан Community 23 November 2019 в 21:17
поделиться

Конструктор - это определенный метод для типа, который принимает указанное число параметров и используется для создания и инициализации объект.

Инициализатор объекта - это код, который запускается на объекте после конструктора и может использоваться для краткой установки любого количества полей в объекте в указанные значения. Установка этих полей происходит после конструктора.

Вы бы использовали конструктор без помощи инициализатора объекта, если конструктор в достаточной степени установил начальное состояние объекта. Однако инициализатор объекта должен использоваться вместе с конструктором. Синтаксис требует явного или неявного использования (VB.Net и C #) конструктора для создания исходного объекта. Вы бы использовали инициализатор объекта, когда конструктор недостаточно инициализирует объект для вашего использования, и это могут сделать несколько простых наборов полей и / или свойств.

44
ответ дан JaredPar 23 November 2019 в 21:17
поделиться

Если у вас есть свойства, которые ДОЛЖНЫ быть установлены для вашего объекта, чтобы он работал правильно, один из способов - выставить только один конструктор, который требует эти обязательные свойства в качестве параметров.

В этом случае вы не можете создать свой объект без указания этих обязательных свойств. Нечто подобное не может быть реализовано инициализаторами объекта.

Инициализаторы объекта на самом деле просто «синтаксическое удобство» для сокращения начальных назначений. Хороший, но не очень функционально значимый.

Марк

16
ответ дан marc_s 23 November 2019 в 21:17
поделиться

Конструктор - это метод (возможно), принимающий параметры и возвращающий новый экземпляр класса. Может содержать логику инициализации. Ниже вы можете увидеть пример конструктора.


public class Foo
{
    private SomeClass s;
    public Foo(string s)
    {
       s = new SomeClass(s);
    }
}

Теперь рассмотрим следующий пример:


public class Foo
{
    public SomeClass s { get; set; }
    public Foo() {}
}

Вы можете достичь того же результата, что и в первом примере, используя инициализатор объекта, предполагая, что вы можете получить доступ к SomeClass, с помощью следующего кода:


new Foo() { s = new SomeClass(someString) }

Как вы можете видеть, инициализатор объекта позволяет вам указывать значения для открытых полей и общедоступных (устанавливаемых) свойств одновременно с созданием, и это особенно полезно, когда конструктор не предоставляет никакой перегрузки, инициализирующей определенные поля. Однако помните, что инициализаторы объектов - это просто синтаксический сахар и что после компиляции они не будут отличаться от последовательности присваиваний.

4
ответ дан em70 23 November 2019 в 21:17
поделиться

Объектные инициализаторы могут быть полезными для инициализации некоторой небольшой коллекции, которая может использоваться для тестирования на начальном этапе создания программы. Пример кода ниже:

    class Program
    {
        static void Main(string[] args)
        {
            List<OrderLine> ordersLines = new List<OrderLine>()
            {
                new OrderLine {Platform = "AmazonUK", OrderId = "200-2255555-3000012", ItemTitle = "Test product 1"},
                new OrderLine {Platform = "AmazonUK", OrderId = "200-2255555-3000013", ItemTitle = "Test product 2"},
                new OrderLine {Platform  = "AmazonUK", OrderId = "200-2255555-3000013", ItemTitle = "Test product 3"}
            };
        }
    }
    class OrderLine
    {
        public string Platform { get; set; }
        public string OrderId { get; set; }
        public string ItemTitle { get; set; }
    }

Вот выгода. В вышеупомянутом примере кода isn’t включал любого конструктора, и он работает правильно, но если некоторый конструктор с параметрами будет включен в класс OrderLine как пример:

public OrderLine(string platform, string orderId, string itemTitle)
{
   Platform = platform;
   OrderId = orderId;
   ItemTitle = itemTitle;
}

компилятор покажет ошибку - нет никакого аргумента, учитывая, что соответствует необходимому формальному parameter†¦. Это может быть зафиксировано включением в класс OrderLine явный конструктор по умолчанию без параметров:

public OrderLine() {}
0
ответ дан 23 November 2019 в 21:17
поделиться

Объектные инициализаторы особенно полезны в выражениях запроса LINQ. Выражения запроса делают частое использование анонимных типов, которые могут только быть инициализированы при помощи объектного инициализатора, как показано в примере кода ниже: '

var orderLineReceiver = new { ReceiverName = "Name Surname", ReceiverAddress = "Some address" };
[еще 113] об этом - Объект и инициализаторы набора

0
ответ дан 23 November 2019 в 21:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: