使用ref关键字的好处

时间:2015-07-16 09:46:11

标签: c#

我只是测试一些东西,我想知道使用ref是否有任何好处。 所以在下面的代码中我有两个方法都接受客户的observablecollection,一个没有ref的一个。  两者都完全相同(更新原始列表)。那么使用ref有什么好处?

 ObservableCollection<Customer> customers;

    public MainWindow()
    {
        InitializeComponent();

        customers = new ObservableCollection<Customer>()
        {
            new Customer () { Id = 1, Name="Batman"},
            new Customer () { Id = 2, Name="Spiderman"},
        };

        AddCutomer(customers);
        AddCutomer(ref customers);
    }

    public void AddCutomer(ObservableCollection<Customer> customers)
    {
        customers.Add(new Customer() { Id = 3, Name = "Superman" });
    }

    public void AddCutomer( ref ObservableCollection<Customer> customers)
    {
        customers.Add(new Customer() { Id = 3, Name = "Superman" });
    }

如果我使用int,那么无论我是否使用关键字ref都无关紧要,它会改变原始值。但是,字符串的行为会有所不同,具体取决于我是否使用ref。

亲切的问候

2 个答案:

答案 0 :(得分:1)

在这种背景下:完全没有。 Ref传递对包含对实例的引用的变量的引用,而不是将引用复制到实例。

static void Main()
{
    int i = 1;
    int j = 2;
    Foo(ref i);
    Console.WriteLine(i); // Should print 10
    Bar(j);
    Console.WriteLine(j); // Should print 2
}
static void Foo(ref int value)
{
    value = 10;
}
static void Bar(int value)
{
    value = 15;
}

Foo会更改i的值,但Bar不会更改j的值。 参考类型的行为完全相同。

ref对结构最有用。在大多数其他情况下,out是首选,因为它可以保证值的更改。

答案 1 :(得分:1)

使用ref作为参考类型,您可以修改引用本身,而不是它所指向的值。

使用您的示例,如果您创建一个新的ObservableCollection并将其分配给customers函数中的AddCustomer变量,那么调用函数MainWindow中的customers变量现在将指向这个新系列。即旧的收藏品将丢失。