2015-12-31 18 views
12

düşünün:Okunan alanlar neden ref parametresiyle değiştirilebilir?

class Foo 
{ 
    private readonly string _value; 

    public Foo() 
    { 
     Bar(ref _value); 
    } 

    private void Bar(ref string value) 
    { 
     value = "hello world"; 
    } 

    public string Value 
    { 
     get { return _value; } 
    } 
} 

// ... 

var foo = new Foo(); 
Console.WriteLine(foo.Value); // "hello world" 

Bu nasıl derliyor, yine de işe? Ben readonly ile işaretlenmiş olarak, yapıcı dışında _value alanına farklı bir değer atamak mümkün olmamalıdır. Bununla birlikte, bir yönteme ref'u aktarın ve gerçekten de manipüle edilebilir.

bu tehlikeli midir? Niye ya? Benim için yanlış geliyor, ama parmağımı üzerine koyamıyorum.

+0

:

class Foo { private readonly string _value; public Foo() { Bar(ref _value); } public void Baz() { Bar(ref _value); } private void Bar(ref string value) { value = "hello world"; } public string Value { get { return _value; } } } 

Yukarıdaki kod bir çok söylüyorum derleyici hatası sağlar. Yararlı bir 'readonly' değişkeni * en az bir kez yazılmalıdır. Belirgin olmayan detay, alan başlatmanın yapıcıda gerçekte gerçekleşmesidir, C# derleyicisi kodu taşır. –

cevap

19

Bu yalnızca derleyicide ref parametresini geçirdiğiniz için derler (readonly alanlarının ayarlanmasına izin verilir). Aramanızı Bar() başka bir yönteme aktardıysanız, başarısız olur. Yazılı asla bir salt okunur değer zaten var Çünkü default` `olduğunu

A readonly field cannot be passed ref or out (except in a constructor)

+0

oldukça fazla. tehlikeli değil _value inşaat sonrası değiştirilemez ne de (bir kenara get erişimcisine itibaren) haricen –

+0

Teşekkür maruz kalmaktadır, çünkü. Bir şekilde benim tarafımdan kaymıştı. :) –