【发布时间】:2019-07-09 07:03:00
【问题描述】:
我在使用内联函数时遇到了这种情况。这在我心中提出了几个问题。
示例 1:(全局 testDeligate)
[Serializable]
class TestClass
{
Func<int, int> testDeligate = (a) => { a = +10; a = +20; return a; };
public void testMethod()
{
int xx = 10;
if (xx == 1)
{
testDeligate(10);
return;
}
else if (xx == 2)
{
testDeligate(20);
return;
}
else if (xx == 3)
{
testDeligate(33);
return;
}
return;
}
}
示例 2:(本地 testDeligate)
[Serializable]
class TestClass
{
public void testMethod()
{
Func<int, int> testDeligate = (a) => { a = +10; a = +20; return a; };
int xx = 10;
if (xx == 1)
{
testDeligate(10);
return;
}
else if (xx == 2)
{
testDeligate(20);
return;
}
else if (xx == 3)
{
testDeligate(33);
return;
}
return;
}
}
在计算 TestClass 的缓冲区大小时,我得到了不同的响应。
TestClass testClass = new TestClass();
var bf = new BinaryFormatter();
var ms = new MemoryStream();
bf.Serialize(ms, testClass);
var size = ms.Length;
示例 1:大小 = 1308
示例 2:大小 = 127
我无法弄清楚这两种情况下缓冲区大小存在差异的原因。
【问题讨论】:
-
没有成员的序列化类的缓冲区总是小于有成员的序列化类的缓冲区
-
二进制序列化通过序列化类的字段来工作。示例 2 没有字段。示例 1 变得强大不仅是因为 testDeligate 字段,而且它还必须序列化 C# 编译器生成的不可见类以实现 lambda 表达式。请注意这是多么脆弱,序列化的数据很容易在代码更改时变得无效。
-
@HansPassant 因此最好使用在方法中定义的内联函数?