C# readonly vs Java final

En Java, final signifie qu'une variable ne peut être attribué que pour une fois, mais cette affectation peut se produire n'importe où dans le programme. En C#, readonly signifie un champ ne peut être attribué dans une constructeur, qui, de l'OMI, est beaucoup moins utiles.

Comme nous le savons tous, C# a été fortement influencée par le dessin Java, mais cette différence m'a toujours laissé perplexe comme étant très bizarre. Personne ne sait si il y a un raison technique dans le CLR, qui a entraîné la moins utile comportement de C#'s readonly vs Java final?

EDIT:

En réponse aux commentaires, je tiens à souligner que je suis bien conscient des avantages de l'immuabilité, et je l'utilise tous sur la place. Je crois readonly est moins utile que Java à cause de cela:

public class Foo 
{
    private readonly int _bar;

    Foo()
    {
        _bar = 5;
    }
}

Oups, j'ai réellement besoin d'initialiser cette valeur dans une méthode d'aide!

public class Foo 
{
    private readonly int _bar;

    Foo()
    {
        initialize()
    }

    private void initialize()
    {
        _bar = 5; //Can't compile because of semantics of readonly
    }     
}
Votre "moins utile" est mon "plus sûr".
Quels sont les avantages de l'immuabilité? Je pense que vous trouverez readonly peut être considérablement utile pour le compilateur. Vous question est par nature subjectif.
Vous ne pouvez pas assing valeur finale varible n'importe où dans le programme en java. Si vous faites une statique de la finale de la constante alors vous avez besoin de donner de la valeur sur le spot sinon, si vous faites variable comme une finale, alors vous pouvez vous lancer dans le constructeur.
Il n'est pas un doublon. Il n'est pas demandé sur le l'équivalent de Java finale en C#. Il montre qu'il sait déjà. Je pense que vous n'avez pas pris la peine de lire la question, que c'est complètement différent.
Cette question est fondée sur un fausse prémisse que vous pouvez initialiser un final Java champ de n'importe où dans la classe. Vous ne pouvez pas faire cela! Le deuxième exemple n'est pas compilé en Java (à l'aide de final).

OriginalL'auteur MgSam | 2013-02-22