首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用大括号的块。这是正确的C#语法吗?它有什么作用吗?

使用大括号的块。这是正确的C#语法吗?它有什么作用吗?
EN

Stack Overflow用户
提问于 2012-02-22 14:24:12
回答 7查看 771关注 0票数 3

我正在阅读别人的代码,我看到了很多这样的例子。我将提供一个代码片段。它是一个库函数,包装了nHibernate。这是会话创建后的第五行,这让我感到困惑。

代码语言:javascript
复制
public T GetById<T>(string id) where T : BaseObject
{
     T retObj = null;
     ISession session = EnsureCurrentSession();
     {
          retObj = session.Get<T>(id);
     }

     return retObj;
}

乍一看,我以为这是using语句的一个例子,但事实并非如此。据我所知,大括号可能不在那里。设置一个块的唯一实际目的是在里面创建变量,并且它们的作用域被限制在块内,但是这里没有发生这种情况。

还是我错过了什么?

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2012-02-22 14:28:43

这里的大括号是多余的,然而,你是对的,你可以创建大括号,以便在该块的作用域内创建变量。但是,这种模式很少使用。

票数 3
EN

Stack Overflow用户

发布于 2012-02-22 14:58:20

该代码看起来像是一个不完整的编辑;代码是合法的,但很奇怪。

要跟进你的声明:

设置块的唯一实际目的是在其中创建变量,并且它们的作用域被限制在块内

这是创建块的实际目的,但不是唯一的目的。例如:

代码语言:javascript
复制
class C
{
    public int x;
    void M()
    {
        x = 123;
        if (whatever)
        {
            int x = q;
        }
    }
}

这个代码是不合法的,因为简单名称x在第一个使用它的代码块中使用不一致。x首先意味着this.x,然后是一个局部变量。这在C#中是不合法的;在C#中,名称在整个代码块中可能只表示一件事,首先使用该名称。

你可以通过以下方式“修复”这个问题:

代码语言:javascript
复制
class C
{
    public int x;
    void M()
    {
        {
           x = 123;
        }
        if (whatever)
        {
            int x = q;
        }
    }
}

因为现在使用相同名称的两个块表示两个不同的东西,它们不会以任何方式重叠。但这是解决问题的一种愚蠢的方法;更好的做法是重命名本地。

票数 6
EN

Stack Overflow用户

发布于 2012-02-22 14:28:58

实际上,在这种情况下,它什么也做不了。实际上,它可能是using块的残留物,例如,在以前的版本中,代码可能如下所示:

代码语言:javascript
复制
using (ISession session = EnsureCurrentSession())
{
   retObj = session.Get<T>(id);
}

就像现在一样,我将回顾一下EnsureCurrentSession是如何实现的。可能using真的应该在那里,或者如果不在,请删除大括号。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9390068

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档