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


Автор: nmn 2.10.2009, 18:22
в книге Accelerated c# 2008 в главе Автореализуемые свойства на странице 77
есть подобный код
Код

class test
    {
        public string name
        { get; private set; }
        public string id
        { get; set; }
    }

public Main()
{
test tst=new test{name="123", id="123"};
}


причем утверждается что это единственный способ установки свойства name, у меня же даже он не сработал
компилятор сказал что не имеет доступа к name.

Автор: ДобренькийПапаша 2.10.2009, 18:32
А вы в какой среде это запускали?))) С какой установленной версией .NET?)))

Автор: nmn 2.10.2009, 18:48
vs 2008, .net 3.5

Автор: ДобренькийПапаша 2.10.2009, 19:05
Цитата

public Main()
{
test tst=new test{name="123", id="123"};
}


Такое можно делать будет только в .NET 4.0

Пусть меня кто поправит, если я не прав)))
Но по-моему я прав)))

Автор: Экскалупатор 2.10.2009, 19:28
попробуй так:
test tst=new test(){name="123", id="123"};

P.S. а ты уверен, что в примере именно private set; ?

Автор: nmn 2.10.2009, 20:18
Цитата(Экскалупатор @  2.10.2009,  19:28 Найти цитируемый пост)

P.S. а ты уверен, что в примере именно private set; ?


уверен


Цитата(Экскалупатор @  2.10.2009,  19:28 Найти цитируемый пост)
test tst=new test(){name="123", id="123"};

не работает

Автор: NightmareZ 2.10.2009, 20:49
Цитата(ДобренькийПапаша @  2.10.2009,  19:05 Найти цитируемый пост)
Такое можно делать будет только в .NET 4.0Пусть меня кто поправит, если я не прав)))Но по-моему я прав)))

Иногда лучше жувать  smile 

nmn, во-первых, что это за бред?
Код

public Main()

Если это функция, то какой тип возвращаемого значения?
Нужно писать так:
Код

public static void Main()

Во-вторых, у тебя сеттер поля name приватный. Поэтому извне полю ничего нельзя присвоить напрямую.

Автор: nmn 2.10.2009, 21:14
Цитата(NightmareZ @ 2.10.2009,  20:49)
Цитата(ДобренькийПапаша @  2.10.2009,  19:05 Найти цитируемый пост)
Такое можно делать будет только в .NET 4.0Пусть меня кто поправит, если я не прав)))Но по-моему я прав)))

Иногда лучше жувать  smile 

nmn, во-первых, что это за бред?
Код

public Main()

Если это функция, то какой тип возвращаемого значения?
Нужно писать так:
Код

public static void Main()

Во-вторых, у тебя сеттер поля name приватный. Поэтому извне полю ничего нельзя присвоить напрямую.

я про книгу http://www.amazon.com/Accelerated-C-2008-Trey-Nash/dp/1590598733, там написано что так можно делать
вот и спрашиваю...
выше же все написано

Автор: NightmareZ 2.10.2009, 21:19
Цитата(nmn @ 2.10.2009,  21:14)
Цитата(NightmareZ @ 2.10.2009,  20:49)
Цитата(ДобренькийПапаша @  2.10.2009,  19:05 Найти цитируемый пост)
Такое можно делать будет только в .NET 4.0Пусть меня кто поправит, если я не прав)))Но по-моему я прав)))

Иногда лучше жувать  smile 

nmn, во-первых, что это за бред?
Код

public Main()

Если это функция, то какой тип возвращаемого значения?
Нужно писать так:
Код

public static void Main()

Во-вторых, у тебя сеттер поля name приватный. Поэтому извне полю ничего нельзя присвоить напрямую.

я про книгу http://www.amazon.com/Accelerated-C-2008-Trey-Nash/dp/1590598733, там написано что так можно делать
вот и спрашиваю...
выше же все написано

Я не знаю, что у тебя там написано в книге. Я говорю, как оно на самом деле.

Автор: Экскалупатор 2.10.2009, 21:46
да в действительно в примере private есть. но это лишний раз подчеркивает то, что бывают опечатки везде. но мне кажется что вполне логично, когда private поле недоступно извне. а если это каким то чудесным образом станет когда то не так, то пропадет весь смысл слова private.

Автор: Crypton 2.10.2009, 22:18
Можно поменять на internal, тогда его можно будет назначить только в самой сборке

Автор: NightmareZ 2.10.2009, 22:24
Цитата(Crypton @ 2.10.2009,  22:18)
Можно поменять на internal, тогда его можно будет назначить только в самой сборке

В данном случае не надо менять спецификатор доступа, а значения присваивать в конструкторе.

Автор: nmn 2.10.2009, 23:25
Цитата(Экскалупатор @ 2.10.2009,  21:46)
да в действительно в примере private есть. но это лишний раз подчеркивает то, что бывают опечатки везде. но мне кажется что вполне логично, когда private поле недоступно извне. а если это каким то чудесным образом станет когда то не так, то пропадет весь смысл слова private.

нет, это не опечатка

в оригинале то же самое

Код

You can also create a read-only auto-implemented property by inserting the private keyword
as shown below:
public class Employee
{
public string FullName { get; private set; }
public string Id { get; set; }
}
At this point, you may be wondering how the FullName field ever gets set. After all, it’s read-only
and the private field representing the underlying storage has a compiler-generated name that we
cannot use in a constructor to assign to it. The solution is to use another new C# 3.0 feature called
object initializers, as shown in the following example:
using System;
public class Employee
{
public string FullName { get; private set; }
public string Id { get; set; }
}
public class AutoProps
{
static void Main() {
Employee emp = new Employee {
FullName = "John Doe",
Id = "111-11-1111"
};
}
}
Object initializers complement auto-implemented properties. Not only do they allow you a
means to set read-only auto-implemented properties, but they also give the instantiator of the
instance syntax similar to that normally provided by constructors whereby one passes values to the
constructor during instantiation to initialize the type appropriately. You can find out more about
object initializers in the “Object Initializers” section later in this chapter.

Автор: KelTron 3.10.2009, 07:25
Это действительно было так в момент написания книги. Но потом компилятор изменили, а книга осталась неисправленной. 
Так что это и не опечатка и не ошибка автора. Сейчас же единственный способ инициализировать приватное свойство - в конструкторе.

Автор: ДобренькийПапаша 3.10.2009, 08:12
Ничего себе)))
Мда, это новость для меня. Я такой конструкции вообще никогда не видел)))

Автор: nmn 3.10.2009, 13:00
Цитата(KelTron @ 3.10.2009,  07:25)
Это действительно было так в момент написания книги. Но потом компилятор изменили, а книга осталась неисправленной. 
Так что это и не опечатка и не ошибка автора. Сейчас же единственный способ инициализировать приватное свойство - в конструкторе.

а есть какие то упоминания об этом в сети?

Автор: PashaPash 3.10.2009, 13:45
nmn, в MSDN (http://msdn.microsoft.com/en-us/library/bb384062.aspx)
Object initializers let you assign values to any accessible fields or properties of an object at creation time without having to explicitly invoke a constructor
там же рядом (http://msdn.microsoft.com/en-us/library/ms173121.aspx):
private - The type or member can only be accessed by code in the same class or struct.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)