我正在阅读别人的代码,我看到了很多这样的例子。我将提供一个代码片段。它是一个库函数,包装了nHibernate。这是会话创建后的第五行,这让我感到困惑。
public T GetById<T>(string id) where T : BaseObject
{
T retObj = null;
ISession session = EnsureCurrentSession();
{
retObj = session.Get<T>(id);
}
return retObj;
}乍一看,我以为这是using语句的一个例子,但事实并非如此。据我所知,大括号可能不在那里。设置一个块的唯一实际目的是在里面创建变量,并且它们的作用域被限制在块内,但是这里没有发生这种情况。
还是我错过了什么?
发布于 2012-02-22 14:28:43
这里的大括号是多余的,然而,你是对的,你可以创建大括号,以便在该块的作用域内创建变量。但是,这种模式很少使用。
发布于 2012-02-22 14:58:20
该代码看起来像是一个不完整的编辑;代码是合法的,但很奇怪。
要跟进你的声明:
设置块的唯一实际目的是在其中创建变量,并且它们的作用域被限制在块内
这是创建块的实际目的,但不是唯一的目的。例如:
class C
{
public int x;
void M()
{
x = 123;
if (whatever)
{
int x = q;
}
}
}这个代码是不合法的,因为简单名称x在第一个使用它的代码块中使用不一致。x首先意味着this.x,然后是一个局部变量。这在C#中是不合法的;在C#中,名称在整个代码块中可能只表示一件事,首先使用该名称。
你可以通过以下方式“修复”这个问题:
class C
{
public int x;
void M()
{
{
x = 123;
}
if (whatever)
{
int x = q;
}
}
}因为现在使用相同名称的两个块表示两个不同的东西,它们不会以任何方式重叠。但这是解决问题的一种愚蠢的方法;更好的做法是重命名本地。
发布于 2012-02-22 14:28:58
实际上,在这种情况下,它什么也做不了。实际上,它可能是using块的残留物,例如,在以前的版本中,代码可能如下所示:
using (ISession session = EnsureCurrentSession())
{
retObj = session.Get<T>(id);
}就像现在一样,我将回顾一下EnsureCurrentSession是如何实现的。可能using真的应该在那里,或者如果不在,请删除大括号。
https://stackoverflow.com/questions/9390068
复制相似问题