c#扩展方法返回值不设置变量
本文关键字:设置 变量 返回值 扩展 方法 | 更新日期: 2023-09-27 18:18:01
为什么这个扩展方法不设置它所应用的值?
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"写入控制台。我不应该重新赋值这个变量,对吧?
我错过了什么吗?
是的-在第一个代码片段中,您没有使用方法的返回值。您所需要做的就是设置返回值,就像在工作用例中所做的那样(第二个代码片段)。更改参数的值没有什么区别,因为它是按值参数。你是否使用了一个扩展方法在这里是无关紧要的。
假设你的代码是实际上是只是:
ExtensionClass.ExtSetBits(test, selectedIndex, 0x1F);
毕竟,这是编译器将代码转换成的内容。如果忽略它是一个扩展方法的事实(您应该这样做,因为它在这里无关紧要),您会期望改变test
的值吗?要做到这一点,您需要通过引用传递它(使用ref
) -但是扩展方法的第一个参数不允许具有ref
修饰符。
您可能需要阅读我关于参数传递的文章,以获得更多的背景知识,以及我关于值类型和引用类型的文章。
byte
为值类型。test
和original
都是不同的值,修改其中一个不修改另一个
您没有修改函数中的测试值。参数是变量的副本,你改变它的值,然后返回它。如果你想操作变量,那么你应该使用ref
修饰符,但扩展方法的第一个参数不能声明为ref
。