Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么VisualStudio要添加;参考「;在重构为方法时对类型进行赋值?_C#_Visual Studio_Refactoring_Ref - Fatal编程技术网

C# 为什么VisualStudio要添加;参考「;在重构为方法时对类型进行赋值?

C# 为什么VisualStudio要添加;参考「;在重构为方法时对类型进行赋值?,c#,visual-studio,refactoring,ref,C#,Visual Studio,Refactoring,Ref,我不理解Visual Studio Express 2013在运行“提取方法”重构时做出的决定。考虑下面的代码: public struct Foo { private readonly int x, y; public int X { get { return x; } } public int Y { get { return y; } } public Foo(int x, int y) { this.x = x;

我不理解Visual Studio Express 2013在运行“提取方法”重构时做出的决定。考虑下面的代码:

public struct Foo
{
    private readonly int x, y;
    public int X { get { return x; } }
    public int Y { get { return y; } }

    public Foo(int x, int y)
    {
        this.x = x;
        this.y = y;
    }
}

class Test
{
    static void Main()
    {
        Foo a = new Foo(1, 2);
        Foo b = new Foo(3, 4);
        Console.WriteLine(a);
        Console.WriteLine(a + "" + b);
    }
}
如果我突出显示第一个
控制台.WriteLine
调用并运行提取方法重构,提取一个名为
OneParameter
的方法,然后对第二个调用执行相同的操作,提取一个名为
TwoParameters
的方法,我将得到以下代码:

class Test
{
    static void Main()
    {
        Foo a = new Foo(1, 2);
        Foo b = new Foo(3, 4);
        OneParameter(a);
        TwoParameters(ref a, ref b);
    }

    static Foo OneParameter(Foo a)
    {
        Console.WriteLine(a);
        return a;
    }

    static void TwoParameters(ref Foo a, ref Foo b)
    {
        Console.WriteLine(a + "" + b);
    }
}
为什么双参数方法有
ref
参数,而没有单参数方法?在这里使用
ref
有什么意义



另外,为什么单参数方法返回Foo?

如果结构是可变和修改的,那么返回和两个引用都会发生。VS2013并没有对结构类型进行任何不变性分析,也没有对选择的代码进行任何变异操作分析。原语/Guid/etc不会发生这种情况,因为框架中有一个硬编码的值类型列表,已知这些值类型是不可变的。

如果结构是可变和修改的,则返回和两个引用都会发生。VS2013并没有对结构类型进行任何不变性分析,也没有对选择的代码进行任何变异操作分析。原语/Guid/etc不会发生这种情况,因为框架中有一个硬编码的值类型列表,已知这些值类型是不可变的。

如果结构是可变和修改的,则返回和两个引用都会发生。VS2013并没有对结构类型进行任何不变性分析,也没有对选择的代码进行任何变异操作分析。原语/Guid/etc不会发生这种情况,因为框架中有一个硬编码的值类型列表,已知这些值类型是不可变的。

如果结构是可变和修改的,则返回和两个引用都会发生。VS2013并没有对结构类型进行任何不变性分析,也没有对选择的代码进行任何变异操作分析。原语/Guid/etc不会发生这种情况,因为框架中有一个硬编码的值类型列表,已知这些值类型是不可变的。

我怀疑您的假设是无效的,但如果没有“之前和之后”的更改,我们无法判断它正在进行的更改。如果没有例子,你的问题很难回答。您需要了解,
ref
仍然会产生非常显著的语义差异,即使使用引用类型也是如此。看,我想你是在通过折射将一小部分信息转换成方法。因此,它不会冒险使用您的局部变量并通过ref传递它。这样,代码将像以前一样编译和运行,并且依赖项保持不变。如果要重构到方法中的代码更改了一个值类型的变量,它必须通过ref将其传递到重构方法中,以便实际更改它。可以传递和更改引用类型,而无需ref@user1323245-2之间的差异是表面的,正如您所注意到的,单参数版本返回一个Foo。因此,这两种方法都迎合了方法(WriteLine)可能更改原始参数的可能性。我们可以立即看到这没有发生,但重构代码只是没有检查。这是出于安全考虑。
ref
s和
return
是同一策略的两面。好吧,没有Roslyn,我看到的行为和你一样。这确实很奇怪。我怀疑你的假设是无效的——但如果没有“之前和之后”的改变,我们就无法判断。如果没有例子,你的问题很难回答。您需要了解,
ref
仍然会产生非常显著的语义差异,即使使用引用类型也是如此。看,我想你是在通过折射将一小部分信息转换成方法。因此,它不会冒险使用您的局部变量并通过ref传递它。这样,代码将像以前一样编译和运行,并且依赖项保持不变。如果要重构到方法中的代码更改了一个值类型的变量,它必须通过ref将其传递到重构方法中,以便实际更改它。可以传递和更改引用类型,而无需ref@user1323245-2之间的差异是表面的,正如您所注意到的,单参数版本返回一个Foo。因此,这两种方法都迎合了方法(WriteLine)可能更改原始参数的可能性。我们可以立即看到这没有发生,但重构代码只是没有检查。这是出于安全考虑。
ref
s和
return
是同一策略的两面。好吧,没有Roslyn,我看到的行为和你一样。这确实很奇怪。我怀疑你的假设是无效的——但如果没有“之前和之后”的改变,我们就无法判断。如果没有例子,你的问题很难回答。您需要了解,
ref
仍然会产生非常显著的语义差异,即使使用引用类型也是如此。看,我想你是在通过折射将一小部分信息转换成方法。因此,它不会冒险使用您的局部变量并通过ref传递它。这样,代码将像以前一样编译和运行,并且依赖项保持不变。如果要重构到方法中的代码更改了一个值类型的变量,它必须通过ref将其传递到重构方法中,以便实际更改它。可以传递和更改引用类型,而无需ref@user1323245-2之间的差异是表面的,正如您所注意到的,单参数版本返回一个Foo。因此,这两种方法都迎合了方法(WriteLine)可能更改原始参数的可能性。我们可以立即看到这没有发生,但重构代码只是没有检查。这是出于安全考虑。
ref
s和
return
是同一策略的两面。好吧,没有Roslyn,我看到的行为和你一样。这确实很奇怪。我怀疑你的假设是inva