在工作中,我们遇到了一个问题,即在通过方法发送副本后原始对象发生了变化.我们确实通过IClonable在原始类中使用找到了解决方法,但是因为我们无法找到它首先发生的原因.
我们编写了这个示例代码来重现问题(类似于我们的原始代码),并希望有人能够解释它为什么会发生.
public partial class ClassRefTest : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
var myclass = new MyClass();
var copy = myclass;
myclass.Mystring = "jadajadajada";
Dal.DoSomeThing(copy);
lit.Text = myclass.Mystring; //Text is expected to be jadajadajada,
but ends up to be referenced
}
}
public class MyClass
{
public string Mystring { get; set; }
}
public static class Dal
{
public static int? DoSomeThing(MyClass daclass)
{
daclass.Mystring = "referenced";
return null;
}
}
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,在DoSomething() …
我知道有很多类似于这个的主题,但没有一个提供我正在寻找的正确答案.
我正在努力在我们的网络上收集所有SQL-Server实例.它应该能够检测正在运行的SQl-Server的版本.我们运行的不同版本在' SQL Server 2000'和' SQL Server 2008 R2' 之间有所不同
为了给你一些背景信息,目前我正在我们的本地网络上开发,但稍后它将在我们的服务器上运行以收集信息.
收集的一些信息是:
通过WMI查询,以上所有工作都没有问题.但我无法通过WMI或Visual Studio 2010中的命名空间获取正确的SQl-Server实例.
我根据其他解决方案在stackoverflow和其他站点周围发现的一些事情:
root\\Microsoft\\SqlServer\\ComputerManagement10使用ServerSettings类.但这只给SQLSERVER和SQLEXPRESS提供了版本号.让它变得毫无用处.root\\CIMV2 Win32_Product包含sql子句的地方.但这会返回比我正在寻找的更多的数据.此外,查询本身非常慢.SqlDataSourceEnumerator,例如.虽然这仅在某个服务正在运行且某些端口处于打开状态时才有效.由于可能的安全问题和可能的错误数据,我们最好不要这样做总结一下:我需要检索SQL-Server域的所有已安装实例,其版本在2000和2008 R2之间变化.
在开展项目时,我发现了一些我和我的同事都无法解释的行为.使用的代码简化如下:
public Foo DoSomethingWithFoo()
{
Foo foo;
try
{
foo = GetFoo();
}
catch (Exception e)
{
DbHandler.LogException(e);
throw;
}
return foo;
}
Run Code Online (Sandbox Code Playgroud)
编译完全正常,但一旦我们删除throw;声明.我们得到一个编译错误:Use of unassigned local variable 'foo'
问题不是解决它,因为我们可以写Foo foo = null;.
我们知道在C#中局部变量没有默认值,这与赋值null不同.只是我们似乎无法弄清楚为什么删除throw语句会导致这种行为.虽然我确实找到了一些关于未定义变量的更多信息,但我还没有找到任何解释这个的信息.
那么这背后的解释是什么?