为什么这个扩展方法不设置它应用的值?
public static byte ExtSetBits(this byte original, byte value, byte bitSize)
{
unchecked { original &= (byte)~bitSize; }
original |= (byte)(value & bitSize);
return original;
}
这是调用 ( selectedIndex = 13 ):
byte test = 0xFF;
test.ExtSetBits(selectedIndex, 0x1F);
Console.WriteLine("test:" + test.ToString("X").PadLeft(2,'0'));
将“test: FF”写入控制台。
如果我这样做,它会起作用:
byte test = 0xFF;
test = test.ExtSetBits(selectedIndex, 0x1F);
Console.WriteLine("test:" + test.ToString("X").PadLeft(2,'0'));
将“test: ED”写入控制台。我不应该重新分配变量吗?我已经编写了许多其他扩展。
最佳答案
Am I missing something?
是的 - 您没有使用第一个代码段中方法的返回值。您所需要的只是设置返回值,就像您在工作案例(您的第二个代码片段)中所做的那样。更改参数 的值没有任何区别,因为它是按值参数。您使用扩展方法这一事实与此无关。
假设您的代码实际上只是:
ExtensionClass.ExtSetBits(test, selectedIndex, 0x1F);
毕竟,这就是编译器将您的代码转换成的目标。如果您忽略它是一个扩展方法这一事实(您应该这样做,因为它与此处无关),您会期望它改变 test
的值吗?为此,您需要通过引用(使用 ref
)传递它 - 但不允许扩展方法的第一个参数具有 ref
修饰符。
您可能想阅读 my article about parameter passing更多背景信息,以及 my article about value types and reference types .
关于C# 扩展方法返回值不设置变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25289093/