Когда я впервые увидел типы значений в C #, первое, что я подумал, было: «Вау, какая замечательная оптимизация», во-вторых, «нам действительно нужна новая языковая конструкция? Разве мы не можем сделать это с помощьюаннотации вместо? ".
Идея в том, что, учитывая класс, мы будем использовать его, как мы всегда это делали
class A {int i;}
class B {
A m_a;
int F(A a) {m_a = a;}
}
По прихоти мы изменим A
на
[ValueType]
class A {int i;int j;}
И компилятор автоматически преобразует класс B
в
class B {
#region A
int A_i;
int A_j;
#endregion
int F(/*A param*/int i,int j) {
#region A_assign
A_i = i;
A_j = j;
#endregion
}
. Имейте в виду, что если компилятор не хочет оптимизировать какой-либо экземпляр - он недолжен.Это будет работать в любом случае.
Могут возникнуть проблемы с шаблонами,
int f<T>() {
T t; // how much stack should I allocate
}
, но я не уверен, что это намного хуже, чем текущая ситуация.Я на самом деле не уверен, что происходит сейчас (f<struct_of_100_bytes>
отличается от f<int>
?).