X hits on this document





78 / 396

Chapter ‎18   Unsafe code

Within the scope of a namespace, class, struct, or enumeration member it is possible to refer to the member in a textual position that precedes the declaration of the member. For example

class A { void F() { i = 1; }

int i = 0; }

Here, it is valid for F to refer to i before it is declared.

Within the scope of a local variable, it is a compile-time error to refer to the local variable in a textual position that precedes the local-variable-declarator of the local variable. For example

class A { int i = 0;

void F() { i = 1;// Error, use precedes declaration int i; i = 2; }

void G() { int j = (j = 1);// Valid }

void H() { int a = 1, b = ++a;// Valid } }

In the F method above, the first assignment to i specifically does not refer to the field declared in the outer scope. Rather, it refers to the local variable and it results in a compile-time error because it textually precedes the declaration of the variable. In the G method, the use of j in the initializer for the declaration of j is valid because the use does not precede the local-variable-declarator. In the H method, a subsequent local-variable-declarator correctly refers to a local variable declared in an earlier local-variable-declarator within the same local-variable-declaration.

The scoping rules for local variables are designed to guarantee that the meaning of a name used in an expression context is always the same within a block. If the scope of a local variable were to extend only from its declaration to the end of the block, then in the example above, the first assignment would assign to the instance variable and the second assignment would assign to the local variable, possibly leading to compile-time errors if the statements of the block were later to be rearranged.

The meaning of a name within a block may differ based on the context in which the name is used. In the example

using System;

class A {}

class Test { static void Main() { string A = "hello, world"; string s = A;// expression context

Copyright Microsoft Corporation 1999-2003. All Rights Reserved.65

Document info
Document views1262
Page views1262
Page last viewedFri Jan 20 10:06:30 UTC 2017