我知道C#中的Reference传递复杂类型,而Value传递基本类型.我可以通过C#中的引用传递原始类型吗?
更新:
谢谢你的回答,但我的例子是?
void test(object x) {
}
long y = 1;
test(ref y);
Run Code Online (Sandbox Code Playgroud)
抛出此异常:'ref'参数类型与参数类型不匹配
Eri*_*ert 20
这里有几个不同的问题.
我可以通过C#中的引用传递原始类型吗?
首先,让我们确保这里的行话是正确的.目前还不清楚你的"原始类型"是什么意思.你的意思是"内置到运行时"类型如int还是long?您是指任何值类型,无论是内置还是用户定义?
我会假设你的问题实际上是
我可以通过引用在C#中传递值类型吗?
值类型称为值类型,因为它们是按值传递的.引用类型称为引用类型,因为它们通过引用传递.所以似乎答案是定义,不是.
但是,它并不那么直截了当.
首先,您可以通过装箱将值类型的实例转换为引用类型的实例:
decimal d = 123.4m; // 128 bit immutable decimal structure
object o1 = d; // 32/64 bit reference to 128 bit decimal
object o2 = o1; // refers to the same decimal
M(o2); // passes a reference to the decimal.
o2 = 456.78m; // does NOT change d or o1
Run Code Online (Sandbox Code Playgroud)
其次,您可以通过创建数组将值类型的实例转换为引用:
decimal[] ds1 = new decimal[1] { 123.4m };
decimal[] ds2 = ds1;
ds2[0] = 456.7m; // does change ds1[0]; ds1 and ds2 refer to the same array
Run Code Online (Sandbox Code Playgroud)
第三,您可以使用"ref"关键字传递对变量(不是值 - 变量)的引用:
decimal d = 123.4m;
M(ref d);
...
void M(ref decimal x)
{ // x and d refer to the same variable now; a change to one changes the other
Run Code Online (Sandbox Code Playgroud)
尝试将ref long传递给接受ref对象的方法会导致编译错误:'ref'参数类型与参数类型不匹配
正确.两侧变量的类型必须完全匹配.有关详细信息,请参阅此问
只需使用ref或out参数修饰符.
void myMethod(ref int myValue) ...
Run Code Online (Sandbox Code Playgroud)
ref是2路.
out是1路.
您可以使用ref函数定义中参数旁边的单词.
public void func(ref int a)
{
//do stuff
}
public void doStuf()
{
int a = 5;
func(ref a);
}
Run Code Online (Sandbox Code Playgroud)
更新后,您可以通过引用传递盒装值。
static void Main(string[] args)
{
var value = 10;
var boxed = (object)value;
TakesValueByRef(ref boxed);
value = (int)boxed;
// value now contains 5.
}
static void TakesValueByRef(ref object value)
{
value = 5;
}
Run Code Online (Sandbox Code Playgroud)
请记住,这样做是糟糕的做法,并且有风险(由于强制转换异常)。
| 归档时间: |
|
| 查看次数: |
9978 次 |
| 最近记录: |