What is the value of an anonymous unattached block in C#?

后端 未结 10 1516
谎友^
谎友^ 2021-01-11 20:43

In C# you can make a block inside of a method that is not attached to any other statement.

    public void TestMethod()
    {
        {
            string x          


        
相关标签:
10条回答
  • 2021-01-11 20:50

    As far as I can see, it'd only be useful from an organizational standpoint. I can't really conceive of any logical value in doing that. Perhaps someone will have a proper example.

    0 讨论(0)
  • 2021-01-11 20:50

    In C# -- like c/c++/java -- braces denote a scope. This dictates the lifetime of a variable. As the closing brace is reached, the variable becomes immediately available for a garbage collection. In c++, it would cause a class's destructor to be called if the var represented an instance.

    As for usage, the only possible use is to free up a large object but tbh, setting it to null would have the same effect. I suspect the former usage is probably just to keep c++ programmers moving to managed code somewhat in familiar and comfortable territory. If really want to call a "destructor" in c#, you typically implement the IDisposable interface and use the "using (var) {...}" pattern.

    Oisin

    0 讨论(0)
  • 2021-01-11 20:51

    An example would be if you wanted to reuse a variable name, normally you can't reuse variable names This is not valid

            int a = 10;
            Console.WriteLine(a);
    
            int a = 20;
            Console.WriteLine(a);
    

    but this is:

        {
            int a = 10;
            Console.WriteLine(a);
        }
        {
            int a = 20;
            Console.WriteLine(a);
        }
    

    The only thing I can think of right now, is for example if you were processing some large object, and you extracted some information out of it, and after that you were going to perform a bunch of operations, you could put the large object processing in a block, so that it goes out of scope, then continue with the other operations

        {
            //Process a large object and extract some data
        }
        //large object is out of scope here and will be garbage collected, 
        //you can now perform other operations with the extracted data that can take a long time, 
        //without holding the large object in memory
    
        //do processing with extracted data
    
    0 讨论(0)
  • 2021-01-11 20:51

    The one practical reason for it to exist is if you want to restrict the scope of some variable when there is no compelling need to introduce any other reason for the block. In actual practice, this is virtually never useful.

    Personally, my guess is that from a language/compiler point of view it's easier to say that you can put a block anywhere a statement is expected, and they simply didn't go out of their way to prevent you from using it without an if/for/method declaration/ etc.

    Consider the beginning this recent blog post from Eric Lippert. An if statement isn't followed by either a single statement or a number of statements enclosed on curly braces, it's simply followed by a single statement. Anytime you enclose 0 to N statements in curly braces you make that section of code equivalent (from the point of view of the language parser) one statement. This same practice applies to all looping structures as well, although as the main point of the blog post explains, it doesn't apply to try/catch/finally blocks.

    When addressing blocks from that point of view the question then becomes, "Is there a compelling reason to prevent blocks from being used anywhere a single statement could be used?" and the answer is, "No".

    0 讨论(0)
  • 2021-01-11 20:52

    Even if it was actually useful for any reason (e.g. variable scope control), I would discourage you from such construct from the standpoint of good old code readibility.

    0 讨论(0)
  • 2021-01-11 20:53

    Scope and garbage collection: When you leave the unattached block, any variables declared in it go out of scope. That lets the garbage collector clean up those objects.

    Ray Hayes points out that the .NET garbage collector will not immediately collect the out-of-scope objects, so scoping is the main benefit.

    0 讨论(0)
提交回复
热议问题