加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

为什么C#不提供内部帮助器来传递属性作为参考?

发布时间:2020-12-15 08:08:52 所属栏目:百科 来源:网络整理
导读:这是关于LANGUAGE DESIGN的问题. 在你阅读完整篇文章之前请不要回答这个问题!谢谢. 由于所有助手都存在于C#中(如lambdas或自动属性),因此我无法通过引用传递属性.让我们说我想这样做: foo(ref my_class.prop); 我收到错误所以我写了: { var tmp = my_clas
这是关于LANGUAGE DESIGN的问题.

在你阅读完整篇文章之前请不要回答这个问题!谢谢.

由于所有助手都存在于C#中(如lambdas或自动属性),因此我无法通过引用传递属性.让我们说我想这样做:

foo(ref my_class.prop);

我收到错误所以我写了:

{
   var tmp = my_class.prop;
   foo(tmp);
   my_class.prop = tmp;
}

现在它有效.但请注意两件事:

>它是通用模板,我没有放任何类型,只有“var”,所以它适用于我必须通过的所有类型和数量的属性
>我必须一遍又一遍地做,没有任何好处 – 这是机械工作

现有问题实际上杀死了Swap等有用的功能.交换通常为3行,但由于它需要2个引用,因此调用它需要5行.当然这是无稽之谈,每次我都想用它来手写“交换”.但是这表明C#阻止了可重复使用的代码,这很糟糕.

问题

那么 – 如果编译器自动创建临时变量(就像我手工做的那样)会发生什么不好,调用函数,并将值分配回属性?这有危险吗?我没有看到它所以我很好奇你觉得为什么这个问题的设计看起来像现在看起来.

干杯,

编辑由于280Z28提供了很好的例子来打败自动包装ref属性的想法,我仍然认为使用临时变量包装属性会很有用.也许是这样的:

Swap(inout my_class.prop1,inout my_class.prop2);

否则没有真正的交换C#:-(

解决方法

关于ref参数的含义和行为,你可以做很多假设.例如,

情况1:

int x;
Interlocked.Increment(ref x);

如果你可以通过ref将属性传递给这个方法,那么调用将是相同的,但它会完全破坏方法的语义.

案例2:

void WaitForCompletion(ref bool trigger)
{
    while (!trigger)
        Thread.Sleep(1000);
}

简介:by-ref参数将内存位置的地址传递给函数.创建临时变量以“通过引用传递属性”的实现在语义上等同于传递值,这正是您在将参数设置为ref时不允许的行为.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读