Допустим, у меня есть это: < /p>
class AA(string a, string b, string? c) {
...
}
record BB {
public string A { get; init; };
public string B { get; init; };
public string? C { get; init; };
public string? D { get; init; };
}
Я хочу добавить AA в bb , чтобы он выглядел как:
record BB {
public string A { get; init; };
public string B { get; init; };
public string? C { get; init; };
public string? D { get; init; };
public AA Aa { get; } = new AA(A, B, C);
}
Но это не компилируется (я предполагаю, потому что члены Bb не инициализированы, пока AA строится.record BB {
public string A { get; init; };
public string B { get; init; };
public string? C { get; init; };
public string? D { get; init; };
private Lazy _Aa = new Lazy(new AA(A, B, C));
public AA Aa => _Aa.Value;
}
Я думал, что это должно работать, поскольку ленивый не будет вызовать новый aa (a, b, c) до тех пор, пока не будет вызван lazy.value , и AA и, в свою очередь, lazy.value не будет вызвана до тех пор, пока объективная инициализация BB завершится. Но компилятор не позволит мне использовать это, несмотря на то, что к тому времени, когда новый AA (...) можно назвать, , b и c уже были бы инициализированы. Идея): < /p>
record BB {
public string A { get; init; };
public string B { get; init; };
public string? C { get; init; };
public string? D { get; init; };
private AA? _Aa;
private readonly ReaderWriterLockSlim _AaLock = new();
public AA Aa
{
get
{
try
{
_AaLock.EnterReadLock();
if (_Aa == null)
{
try
{
_AaLock.EnterUpgradeableReadLock();
if (_Aa == null) {
try
{
_AaLock.EnterWriteLock();
_Aa = new(A, B, C);
}
finally
{
_AaLock.ExitWriteLock();
}
}
}
finally
{
_AaLock.ExitUpgradeableReadLock();
}
}
}
finally
{
_AaLock.ExitReadLock();
}
}
}
}
< /code>
Да, я знаю, что могу сделать все вышеперечисленное, если я не поддерживаю блок инициирования (т. Е. Используйте явный конструктор и установите все значения там). Просто интересно, есть ли способ сделать это при поддержке метода создания объектов init.var bb = new BB() {
A = "my A",
B = "my B",
C = "my C",
}
< /code>
против того, что я знаю, будет работать, но не поддержит приведенный выше метод создания блоков init: < /p>
var bb = new BB("my A", "my B", "my C", null);
// with constructor of BB being:
public BB(string a, string b, string? c, string? d) {
A = a;
B = b;
C = c;
D = d;
Aa = new AA(a, b, c);
}
Подробнее здесь: https://stackoverflow.com/questions/796 ... properties
Автоматическое свойство в зависимости от других свойств ⇐ C#
Место общения программистов C#
-
Anonymous
1749809063
Anonymous
Допустим, у меня есть это: < /p>
class AA(string a, string b, string? c) {
...
}
record BB {
public string A { get; init; };
public string B { get; init; };
public string? C { get; init; };
public string? D { get; init; };
}
Я хочу добавить AA в bb , чтобы он выглядел как:
record BB {
public string A { get; init; };
public string B { get; init; };
public string? C { get; init; };
public string? D { get; init; };
public AA Aa { get; } = new AA(A, B, C);
}
Но это не компилируется (я предполагаю, потому что члены Bb не инициализированы, пока AA строится.record BB {
public string A { get; init; };
public string B { get; init; };
public string? C { get; init; };
public string? D { get; init; };
private Lazy _Aa = new Lazy(new AA(A, B, C));
public AA Aa => _Aa.Value;
}
Я думал, что это должно работать, поскольку ленивый не будет вызовать новый aa (a, b, c) до тех пор, пока не будет вызван lazy.value , и AA и, в свою очередь, lazy.value не будет вызвана до тех пор, пока объективная инициализация BB завершится. Но компилятор не позволит мне использовать это, несмотря на то, что к тому времени, когда новый AA (...) можно назвать, , b и c уже были бы инициализированы. Идея): < /p>
record BB {
public string A { get; init; };
public string B { get; init; };
public string? C { get; init; };
public string? D { get; init; };
private AA? _Aa;
private readonly ReaderWriterLockSlim _AaLock = new();
public AA Aa
{
get
{
try
{
_AaLock.EnterReadLock();
if (_Aa == null)
{
try
{
_AaLock.EnterUpgradeableReadLock();
if (_Aa == null) {
try
{
_AaLock.EnterWriteLock();
_Aa = new(A, B, C);
}
finally
{
_AaLock.ExitWriteLock();
}
}
}
finally
{
_AaLock.ExitUpgradeableReadLock();
}
}
}
finally
{
_AaLock.ExitReadLock();
}
}
}
}
< /code>
Да, я знаю, что могу сделать все вышеперечисленное, если я не поддерживаю блок инициирования (т. Е. Используйте явный конструктор и установите все значения там). Просто интересно, есть ли способ сделать это при поддержке метода создания объектов init.var bb = new BB() {
A = "my A",
B = "my B",
C = "my C",
}
< /code>
против того, что я знаю, будет работать, но не поддержит приведенный выше метод создания блоков init: < /p>
var bb = new BB("my A", "my B", "my C", null);
// with constructor of BB being:
public BB(string a, string b, string? c, string? d) {
A = a;
B = b;
C = c;
D = d;
Aa = new AA(a, b, c);
}
Подробнее здесь: [url]https://stackoverflow.com/questions/79664344/automatic-property-dependent-on-other-properties[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия