代码之家  ›  专栏  ›  技术社区  ›  Matt Davis

C#[重复]中缺少“with”关键字

  •  25
  • Matt Davis  · 技术社区  · 17 年前

    今天我在看Infragistics控件库的在线帮助,看到了一些使用 具有

    C#是否有一个关键字或类似的构造来模拟 具有

    编辑: 在问我的问题之前,我搜索了一个已有的条目,但没有找到引用的一条射线( here ).那么,为了进一步完善这个问题,C#没有这个功能有技术上的原因吗?Gulzar说对了-不,没有技术上的原因说明C#没有 具有 关键词。这是语言设计师的设计决定。

    7 回复  |  直到 9 年前
        1
  •  26
  •   Community Mohan Dere    6 年前

    这是C#计划经理必须说的: Why doesn't C# have a 'with' statement?

    • 小的或不存在的可读性优势。 我们认为可读性的好处很小或根本不存在。我不会说with语句会降低代码的可读性,但有些人可能会这么说。

    • 添加with语句将使语言更加复杂。例如,VB必须添加新的语言语法来解决局部变量(文本)和“with”目标(.Text)上的属性之间的潜在歧义。解决这个问题的其他方法也会引入语言复杂性。另一种方法是推送作用域并使属性隐藏局部变量,但是如果不添加一些转义语法,就无法引用局部变量。

    • C++从来没有过一个One语句,而这种声明的缺乏通常不被C++开发者认为是一个问题。另外,我们也不认为其他的改变——人们正在编写的代码类型的改变、平台的改变、语言的其他改变等等——使得语句变得更加必要。

        2
  •  15
  •   Matthew Olenik    17 年前

    在C#3.0中,创建对象时可以使用对象初始值设定项来实现类似的效果。

    var control = new MyControl
    {
        Title = "title",
        SomeEvent += handler,
        SomeProperty = foo,
        Another = bar
    };
    

    而不是:

    var control = new MyControl();
    control.Title = "title";
    control.SomeEvent += handler;
    control.SomeProperty = foo;
    control.Another = bar;
    

    注意,尽管这种语法是在C#3.0中引入的,但您仍然可以在2.0框架中使用它,它只是编译器引入的语法糖。

        3
  •  10
  •   Gabe Moothart    17 年前

    这不是惯用的c#,但是如果你真的想要一个 with 同样,您可以这样做:

    Person MyPersonWithALongName = new Person();
    MyUtils.With(MyPersonWithALongName, p => {
    
        p.Name = "George";
        p.Address = "123 Main St";
        ...
    
    });
    
    class MyUtils {
    
        public static void With<T>(T x, Action<T> do) {
            do(x);
        }
    }
    


    我突然想到,您可以通过将其转换为扩展方法,或者将其重命名为“Alias”或“As”以实现可重用性,从而使其更加简洁:

    MyPersonWithALongName.Alias(p => {
        p.Name = "George";
        p.Address = "123 Main St";
        ...
    });
    
        4
  •  9
  •   Guffa    17 年前

    如果引用名称较长,则可以使用变量轻松地对其进行较短的引用,甚至为其提供有限的范围:

    {
       SomeClass r = Some.Lengthy.Path.To.Get.To.A.Referece;
       r.Some = 42;
       r.Properites = "none";
       r.To = 1;
       r.Set = null;
    }
    
        5
  •  1
  •   sonjz    14 年前

    对于这些解决方案:

    // ....
    // (class Common)
    
    public static void With<T>(T property, Action<T> action) {
        action(property);
    }
    
    // ...
    // usage somewhere ...    
    Person person = GetPerson();
    Common.With(person, p => { p.Name = "test", p.Age = "123" });
    

    理想情况下,我们都希望看到对语法进行一些修改,以便使用类似于当前多个属性初始化的方式:

    Person person = new Person() { Name = "test", Age = "123" };
    
        6
  •  0
  •   Ed Swangren    17 年前

    不,这是C#dev团队有意识地做出的决定。人们对“with”关键字有着复杂的感觉,因为它在被滥用时会降低代码的可读性(与嵌套)。

        7
  •  0
  •   Kibbee    17 年前

    我不认为它不存在有技术上的原因。我想说的是,它不存在的原因是它是一个编程构造,它的存在仅仅是为了减少键入。有了intellisense、复制和粘贴等功能,世界对此类功能的需求就不多了。我使用VB.Net,甚至记不起它是否仍然受支持。从来没有真正觉得有必要使用它。

    推荐文章