Автоматическое свойство в зависимости от других свойствC#

Место общения программистов C#
Ответить
Anonymous
 Автоматическое свойство в зависимости от других свойств

Сообщение 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);
}


Подробнее здесь: https://stackoverflow.com/questions/796 ... properties
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»