916 C# Programming Language, The, 4th Edition


4 months ago
Full text


  He has 17 years of expe- rience as a senior developer and software architect in the health, education, and telecommunication industries, and is the author of LINQPad, the utility for interactivelyquerying databases in LINQ. Several C# features aid in the construction of robust and durable applications: Garbage collection automatically reclaims memory occupied by unused objects; exception handling provides a structured and extensible approach to error detection and recovery; and the type-safe design of the language makes it impossible to read from uninitialized variables, to index arrays beyond their bounds, or to perform unchecked type casts.int C# has a unified type system.

ISBN-13: 978-0-321-74176-9

  He has 17 years of expe- rience as a senior developer and software architect in the health, education, and telecommunication industries, and is the author of LINQPad, the utility for interactivelyquerying databases in LINQ. Several C# features aid in the construction of robust and durable applications: Garbage collection automatically reclaims memory occupied by unused objects; exception handling provides a structured and extensible approach to error detection and recovery; and the type-safe design of the language makes it impossible to read from uninitialized variables, to index arrays beyond their bounds, or to perform unchecked type casts.int C# has a unified type system.

1.1 Hello, World 1

  Intr oduction Early in the design of the framework, we kept a careful eye on exactly how this section of the C# language specification would have to be written as a bellwether of the com-plexity of the language. Assuming that the source code of the example is stored in the file , the command line csc /t:library acme.csMain compiles the example as a library (code without a entry point) and produces an acme.dll assembly named .

1 C# permits the source text of a program to be stored in several source files. When a multi-

  Intr n n฀oduction ERIC LIPPERT Probably the most common misconception about value types is that they are “stored on the stack,” whereas reference types are “stored on the heap.”First, that behavior is an implementation detail of the runtime, not a fact about the language. Struct types User-defined types of the form struct S {...} Nullable types Extensions of all other value types with a null value Reference Class types Ultimate base class of all other types: object typesUnicode strings: stringoduction User-defined types of the form class C {...}Intr Interface types User-defined types of the form interface I {...} 1.

1. Category Bits Type Range/Precision

  In the following example, an value is converted to 1.object int and back again to .using System; class Test{ static void Main() {int i = 123; object o = i; // Boxingint j = (int)o; // Unboxing }oduction }Introbject When a value of a value type is converted to type , an object instance, also called 1.a “box,” is allocated to hold the value, and the value is copied into that box. In the preceding example, x would be evaluated, then y , then z x because the happens before that of y because x is to the left of y ERIC LIPPERT Precedence controls the order in which the operators are executed, x + (y * z) ; the evaluation of the multiplication happens before the addition because the multiplication has higher precedence.

1. Console.WriteLine("{0} arguments", n);

  A class declaration starts with a header that specifies the attributes and modifiers of the class, the name of the class, the base class(if given), and the interfaces implemented by the class. The header is followed by the class body, which consists of a list of member declarations written between the delimit- { } ers and .

1. The following is a declaration of a simple class named

  JoN SkEET I’d argue that “shared” (as used in Visual Basic) gives an incorrect similar languages, rather than because it is a particularly sensible or descriptive term for “shared by all instances of a class.”n n฀ ERIC LIPPERT The term “static” was chosen because of its familiarity to users of The members of a class are either static members or instance members. Intr oduction Point operator, which allocates memory for a new instance, invokes a constructor to initialize the instance, and returns a reference to theinstance.

1.6.1 Members

  1.6 Classes and objects Member Description 1. Constants Constant values associated with the class Intr IntrFields Variables of the classoduction oduction Methods Computations and actions that can be performed by the class Properties Actions associated with reading and writing named properties of the classIndexers Actions associated with indexing instances of the class like an array Events Notifications that can be generated by the class 1.

1.6.2 Accessibility

  The five possible forms of accessibility are Intr summarized in the following table.oduction Accessibility Meaning publicAccess not limited protectedAccess limited to this class or classes derived from this class internalAccess limited to this program protected internalAccess limited to this program or classes derived from this class privaten n฀ Access limited to this class publickRzySzToF CWALINA People need to be careful with the keyword.public public in C# is not equivalent to in C++! Introduction n n฀CHRISTIAN NAGEL I would describe the internal access modifier as “access lim- ited to this assembly” instead of “access limited to this program.” If the internal access modifier is used within a DLL, the EXE referencing the DLL does not have access to it.

1.6.3 Type Parameters 1

  The type parameters can then beused in the body of the class declarations to define the members of the class. In the follow- Pair TFirst TSecond ing example, the type parameters of are and : public class Pair<TFirst, TSecond> {public TFirst First; public TSecond Second;} A class type that is declared to take type parameters is called a generic class type.

1.6.4 Base Classes

  Intr A class declaration may specify a base class by following the class name and type param- oduction eters with a colon and the name of the base class. In the following example, the base class of is Point Point object , and the base class of is : public class Point {public int x, y; public Point(int x, int y){ 1.this.x = x; this.y = y; Intr}oduction } public class Point3D : Point{ public int z;public Point3D(int x, int y, int z): base(x, y) {this.z = z; }} A class inherits the members of its base class.

1.6.5 Fields 1

  Color r g In the following example, each instance of the class has a separate copy of the , , bBlack White Red Green Blue and instance fields, but there is only one copy of the , , , , and static fields: 1.6 Classes and objects public class Color {public static readonly Color Black = new Color(0, 0, 0); 1. Assignment to a field can occur only as part of the field’s declaration or oduction in a constructor in the same class.n n฀readonly BRAD ABRAMS protects the location of the field from being changed outside the type’s constructor, but does not protect the value at that location.

1.6.6 Methods

  Methods have a (possibly empty) list of parameters, which represent values or variable references passed to the method, and a return type, which specifies the type of the valuecomputed and returned by the method. The signature of a method consists of the name of the method, the number of type param- eters, and the number, modifiers, and types of its parameters. Parameters

  However, in an invocation of a method with a param-eter array, it is possible to pass either a single argument of the parameter array type or any number of arguments of the element type of the parameter array. Only the last parameter of a method can be a parameter array, and the type of a parameter array must be a single-dimensionalarray type. Method Body and Local Variables A method’s body specifies the statements to execute when the method is invoked

  A method body can declare variables that are specific to the invocation of the method. i example, if the declaration of the previous did not include an initial value, the compiler i i would report an error for the subsequent usages of because would not be definitely Intr assigned at those points in the program.oductionreturn A method can use statements to return control to its caller. Static and Instance Methods

  n n฀Intr ERIC LIPPERT It is, of course, perfectly legal for a static method to access instanceoduction members should it happen to have an instance handy.static A method declared without a modifier is an instance method. Because the constructor is anserialNo instance member, it is permitted to access both the instance field and the IntrnextSerialNo static field.

1. GetNextSerialNo SetNextSerialNo nextSerialNo

  Intr Intr oduction oduction When a virtual method is invoked, the runtime type of the instance for which that invoca- tion takes place determines the actual method implementation to invoke. Whereas a virtual method declaration introduces a new method, anoverride method declaration specializes an existing inherited virtual method by providing 1.a new implementation of that method.n n฀ Intr oductionERIC LIPPERT A subtle point here is that an overridden virtual method is still considered to be a method of the class that introduced it, and not a method of the class that overrides it.

1. You should almost always use a virtual method instead:

class Person { public virtual double GetHourlyRate() {return 0.0; }} class Student {public override double GetHourlyRate() {oductionreturn 1.0; } Intr} class Employee { 1.public override double GetHourlyRate() { return 10.0;} } Method Overloading

  The way many developers on the consuming end think about method overloading is that a single method takes a variety of arguments. NET Frame- string work (before version 1 shipped), we had this set of overloads on the class: public class String { public int IndexOf (string value);// Returns the index of value with this instance public int IndexOf (char value);// Returns the index of value with this instance public int IndexOf (char [] value);// Returns the first index of any of the // characters in value within the current instance} Continued Intr oduction "Joshua, Hannah, Joseph".

1. This last overload caused problems, as it does a different thing. For example

  Intr oduction public class String { public int IndexOf (string value);// Returns the index of value within this instance public int IndexOf (char value);// Returns the index of value within this instance public int IndexOfAny(char [] value);// Returns the first index of any of the // characters in value within the current instance} n n฀ 1. Intr oduction overload resolution rules sometimes favor methods declared in the most derived class, that can sometimes mean a method declared in the derived class may be choseninstead of a method that appears to be a better match in the base class. Constructors

  A constructor is declared like a method with no return type and the same name as the con- static taining class. For example, you might capture the name of the file or the path to the database, but don’t Intr open those external resources until absolutely necessary. Properties

  n n฀ JESSE LIBERTy A property looks to the creator of the class like a method allow- ing the developer to add behavior prior to setting or retrieving the underlying value. In contrast, the property appears to the client of the class as if it were a field, providing direct, unencumbered access through the assignment operator.

1. If you don’t want to layer in anything besides storage, let the compiler implement the

  A property that has both a get accessor and a accessor is a read-write property, a property that has only a set get accessor is a read-only property, and a property that has only a set accessor is a write-only property. A property is declared like a field, except that the declaration ends with a get accessor of the property is invoked to compute the value of the property. Indexers

  An this indexer is declared like a property except that the name of the member is followed by [ ] a parameter list written between the delimiters and . Similar to properties, indexers can be read-write, read-only, and Intr write-only, and the accessor(s) of an indexer can be virtual.

1. List

  int The class declares a single read-write indexer that takes an parameter. ToUpper(); } 1.6 Classes and objectsIndexers can be overloaded, meaning that a class can declare multiple indexers as long as the number or types of their parameters differ. Events

  An event is oduction oductionevent declared like a field except that the declaration includes an keyword and the type must be a delegate type. n n฀ eventJESSE LIBERTy In truth, is just a keyword that signals C# to restrict the way a delegate can be used, thereby preventing a client from directly invoking an event or hijacking an event by assigning a handler rather than adding a handler.

1. Unfortunately, with the

  If no event handlers are present, the field is and public keyword is the one time where it’s okay to make a field event The use of the , because the compiler narrows the use to safe operations. WriteLine(changeCount); // Outputs "3" }} For advanced scenarios where control of the underlying storage of an event is desired, an event declaration can explicitly provide add and remove accessors, which are somewhat similar to the set accessor of a property.n n฀CHRIS SELLS As of C# 2.0, explicitly creating a delegate instance to wrap a method was no longer necessary. Operators

  An operator is a member that defines the meaning of applying a particular expression operator to instances of a class. Specifically, the operators define equality of two , and thus gives new meaning to expressions that apply those operators to public operator != and operator == class declares two operators, List<T> The static .

1. The first outputs because the two lists contain the same number

  List<T> operator == of objects with the same values in the same order. WriteLine False a b the first would have output because and reference different List<int> instances. Destructors

  A destructor is a member that implements the actions required to destruct an instance of a class. The destructor for an instance is invoked automatically Intr during garbage collection.

1. The garbage collector is allowed wide latitude in deciding when to collect objects and run

  If is a 10 a b struct, the output is because the assignment of to creates a copy of the value, and this a.x copy is unaffected by the subsequent assignment to . Because the actual type of the object is EditBox , the casts succeed.object obj = new EditBox(); IControl control = (IControl)obj; IDataBound dataBound = (IDataBound)obj; In the previous EditBox class, the Paint method from the IControl VLADIMIR RESHETNIkoV Actually, explicitly implemented interface members can also be accessed via a type parameter, constrained to the interface type.

1. Red

  On one of my first assignments I got back from my teacher, I saw a big red circle around the number 65 in my source code and the scrawled note, “NoMagic Constants!!” My teacher was instilling in me the virtues of using the constant Color c = 0;BRAD ABRAMS My first programming class in high school was in Turbo Pascal implies that you should always ensure that zero is a valid member of any enum type. Thus the multiplier example above can be written more easily without Multiplier using a class: double[] doubles = Apply(a, (double x) => x * 2.0); An interesting and useful property of a delegate is that it does not know or care about the class of the method it references; all that matters is that the referenced method has the same 1.

2.2.1 Grammar Notation

  The first line of a grammar production is the name of the nonterminal symbol being defined, followed by a colon. For example, the production re restatement-list:tu tu uc ucstatementtr trstatement-list statementl S l S ca caxi defines a statement-list to either consist of a statement or consist of a statement-list followed xiLe Le by a statement.

2. A subscripted suffix “ ” is used to indicate an optional symbol. The production

  Le Le Every source file in a C# program must conform to the input production of the lexical xic xic grammar (§2.3).al al St Stru ru 2.2.3 Syntactic Grammarctu ctu re re The syntactic grammar of C# is presented in the chapters and appendices that follow this chapter. re re tu tu The lexical processing of a C# source file consists of reducing the file into a sequence of uc uc tr tr tokens, which then becomes the input to the syntactic analysis.

2. When several lexical grammar productions match a sequence of characters in a source file

the lexical processing always forms the longest possible lexical element. For example, the // character sequence is processed as the beginning of a single-line comment because that / lexical element is longer than a single token.re tuuc

2.3.1 Line Terminators

tr Line terminators divide the characters of a C# source file into lines.l S canew-line:xi Le U+000D Carriage return character ( )


U+000D U+000A

Line feed character ( ) 2. Carriage return character ( ) followed by line feed character ( ) U+0085 Next line character ( ) U+2028 Line separator character ( ) U+2029 Paragraph separator character ( )For compatibility with source code editing tools that add end-of-file markers, and to enable a source file to be viewed as a sequence of properly terminated lines, the following trans-formations are applied, in order, to every source file in a C# program:


  2.3 Lexical Analysis U+000D file is non-empty and if the last character of the source file is not a carriage return U+000D U+000A U+2028 ( ), a line feed ( ), a line separator ( ), or a paragraph separator LeU+2029 ( ).xic al 2.3.2 CommentsSt ru Two forms of comments are supported: single-line comments and delimited comments. ctu// Single-line comments start with the characters and extend to the end of the source line.re /* */Delimited comments start with the characters and end with the characters .

2.3.3 White Space

  White space is defined as any character with Unicode class Zs (which includes the space character) as well as the horizontal tab character, the vertical tab character, and the formfeed character. 2.4 Tokens whitespace: 2.


Vertical tab character ( ) xic


  Form feed character ( ) al Stru ctu re There are several kinds of tokens: identifiers, keywords, literals, operators, and punctua- tors. White space and comments are not tokens, though they act as separators for tokens.

2.4.1 Unicode Character Escape Sequences 2

  Since C# uses a 16-bit encoding ofUnicode code points in characters and string values, a Unicode character in the rangeU+10000 to U+10FFFF is not permitted in a character literal and is represented using a Unicode surrogate pair in a string literal. WriteLine(c.ToString()); }re re } tu tuuc uc \u0066 f shows several uses of , which is the escape sequence for the letter “ ”.

2.4.2 Identifiers

  uc tr The rules for identifiers given in this section correspond exactly to those recommended by l S the Unicode Standard Annex 31, except that underscore is allowed as an initial character ca (as is traditional in the C programming language), Unicode escape sequences are permit- xi Le @ ted in identifiers, and the “ ” character is allowed as a prefix to enable keywords to be used as identifiers. Note that since Unicode escapes are not permitted in keywords, the token cl\u0061ss@class “ ” is an identifier, and is the same identifier as “ ”.re tu Two identifiers are considered the same if they are identical after the following transforma- uc tr tions are applied, in order:l S ca @ xi Le •฀ Each unicode-escape-sequence is transformed into its corresponding Unicode character.

2. U+005F

  2.4.3 keywords A keyword is an identifier-like sequence of characters that is reserved, and cannot be used @ as an identifier except when prefaced by the character. In such cases, the declared name takes prece- xic dence over the use of the identifier as a contextual keyword.al Stn n฀ru ERIC LIPPERT C# has not added any new reserved keywords since its originalctuyield select release.

2.4.4 Literals A literal is a source code representation of a value

  LeU u xicuint ulong represented: , .al St L l rulong ulong represented: , .ctu re UL Ul uL ul LU Lu lU lu ulong •฀ If the literal is suffixed by , , , , , , , or , it is of type .ulong If the value represented by an integer literal is outside the range of the type, a compile-time error occurs. In all other situations, uint such a decimal-integer-literal is of type .re63 tu ucL ltype-suffix or the integer-type-suffix or appears as the token immediately following atrlong unary minus operator token (§7.7.2), the result is a constant of type with the value l S63 ca −9223372036854775808 (−2 ). Real Literals

  Otherwise, the real 2.type suffix determines the type of the real literal, as follows: LeF f float 1f 1.5f 1e10f 123.456F float and are all of type .xic al D d double 1d 1.5d 1e10d St123.456D doubleru and are all of type .ctu M m decimal 1m 1.5m re1e10m 123.456M decimal decimal , and are all of type . 2.900m2900 Hence the literal will be parsed to form the decimal with sign , coefficient , Le Le 3 and scale .xic xic al al If the specified literal cannot be represented in the indicated type, a compile-time error St St occurs.ru ru ctu ctufloat double The value of a real literal of type or is determined by using the IEEE “round re re to nearest” mode.

1.3 F

1. F example, is a real literal but is not

  2. n n฀Lem f JoSEPH ALBAHARI Of all the numeric suffixes, and are by far the most useful.xicfloat decimal Without these suffixes, a fractional or literal cannot be specified with- al 1.5 out a cast. Character Literals

  A character literal represents a single character, and usually consists of a character in re'a' quotes, as in .tu uccharacter-literal:tr ' 'l S character caxicharacter: Lesingle-character 2. opt opt opt\ A character that follows a backslash character ( ) in a character must be one of the following ' " \ a b f n r t u U x v characters: , , , , , , , , , , , , , .


  If the value represented by a character literal is greater than , a compile-time error ca occurs.xi Le A Unicode character escape sequence (§2.4.1) in a character literal must be in the range 2. A simple escape sequence represents a Unicode character encoding, as described in the table below. String Literals

  A regular string literal consists of zero or more characters enclosed in double quotes, as in Le"hello" \t , and may include both simple escape sequences (such as for the tab character), xic and hexadecimal and Unicode escape sequences.al St @ A verbatim string literal consists of an character followed by a double-quote character, ru zero or more characters, and a closing double-quote character. We were lucky to 2.have such a good, early international following for C#, which allowed us to fix this Le potential error very early in the design of the language.xic al Since a hexadecimal escape sequence can have a variable number of hex digits, the string St"\x123"ru literal contains a single character with hex value 123.

2. True is because the two literals refer to the same string instance

  One of the benefits oftu tu interning is that it reduces the size of the compiled assembly because duplicate string uc uc tr tr literals are factored out.l S l Sa b object In the preceding example, and are declared of type , which forces the sub- ca ca xixiobject a b sequent comparison to use ’s reference-type equality semantics. If and were Le Lestring string == declared of type , the comparison would bind to ’s operator, which true 2. The null Literal

  I rarely, if ever, use any of the preprocessing directives—but I can only imagine the storm of criticism if C# had not included a strong set of preprocessing Le directives.xic alSt The preprocessing directives provide the ability to conditionally skip sections of source ru files, to report error and warning conditions, and to delineate distinct regions of source ctu code. re Preprocessing directives are not tokens and are not part of the syntactic grammar of C#.tu However, preprocessing directives can be used to include or exclude sequences of tokens uc tr and can in that way affect the meaning of a C# program.

2.5.3 Declaration Directives

  The processing of a #define directive causes the given conditional compilation symbol to become defined, starting with the source line that follows the directive. Likewise, the pro-cessing of a #undef directive causes the given conditional compilation symbol to become undefined, starting with the source line that follows the directive.

2.5.4 Conditional Compilation Directives

  The selected conditional-section, if any, is processed as a normal input-section: The source code contained in the section must adhere to the lexical grammar; tokens are generatedfrom the source code in the section; and preprocessing directives in the section have the prescribed effects. #elif The remaining conditional-sections, if any, are processed as skipped-sections: Except for pre- processing directives, the source code in the section need not adhere to the lexical gram-mar; no tokens are generated from the source code in the section; and preprocessing directives in the section must be lexically correct but are not otherwise processed.

2.5.5 Diagnostic Directives

pp-message: new-linerewhitespace input-characters new-line opttu uctr The example l S#warning Code review needed before check-inca xi #if Debug && RetailLe #error A build can't be both debug and retail #endif 2.class Test {...} always produces a warning (“Code review needed before check-in”), and produces a com- Debug pile-time error (“A build can’t be both debug and retail”) if the conditional symbols re re tu tu Retail and are both defined. Note that a pp-message can contain arbitrary text; specifically, uc uccan't it need not contain well-formed tokens, as shown by the single quote in the word .tr tr l S l Sca ca

2.5.6 Region Directives

  2.pp-start-region conditional-section pp-end-region opt pp-start-region:re # regionwhitespace whitespace pp-message opt opttu ucpp-end-region:tr # endregionwhitespace whitespace pp-messagel S opt opt caxi No semantic meaning is attached to a region; regions are intended for use by the program- Le mer or by automated tools to mark a section of source code. The message specified in a #region #endregion or directive likewise has no semantic meaning; it merely serves to 2.

2.5.7 Line Directives 2

  Line directives may be used to alter the line numbers and source file names that are reported by the compiler in output such as warnings and errors. When processing a directive that includes a line-indicator al Stdefault that is not , the compiler treats the line after the directive as having the given line ru number (and file name, if specified).ctu n n฀re JoN SkEET If you’re writing a tool that generates code from some other source,#line you might think that the easiest approach is to just include a directive for every #line line you output.

2. A

2.5.8 Pragma Directives

  The #pragma warning directive is used to disable or restore all or a particular set of warning messages during compilation of the subsequent program text. pragma-warning-body:warningwhitespace warning-actionwarningwhitespace warning-action whitespace warning-list warning-action:disable restore preprocessing directive is used to specify optional contextual information to the compiler. Pragma Warning

  #pragma warning The following example shows use of to temporarily disable the warning 2.reported when obsoleted members are referenced, using the warning number from the Le Microsoft C# compiler.using System;xic alclass Program St{ru [Obsolete]ctustatic void Foo() {}restatic void Main() { #pragma warning disable 612Foo(); #pragma warning restore 612} n n฀ } JoSEPH ALBAHARI The compiler generates a warning when it detects a condi- tion that might possibly indicate a mistake in the code. Ordinarily, the Basic Concepts declared accessibility (§3.5.1) of a method is determined by the access modifiers (§10.3.5) 3.specified in its declaration, and similarly the declared accessibility of a type is determined by the access modifiers specified in its declaration.

3.2 Application Termination Application termination returns control to the execution environment

  void } If the return type of the entry point method is , reaching the right brace ( ) that termi- return nates the method, or executing a statement that has no expression, results in a ter- mination status code of . Note that base classes do not contribute to the declaration space of a class, and base interfaces do not contribute to the declaration space of an interface.

3. Thus, within a nested declaration space, it is not possible to declare a local variable or

  Because the two declarations contribute to the same declaration space, it would have caused a compile-time error if each contained a declaration of a classwith the same name. Thus, in F G the following example, the and methods result in a compile-time error because the Basic Conceptsi name is declared in the outer block and cannot be redeclared in the inner block.

3.4 Members 3

  The members of an entity are generally available Basic Concepts through the use of a qualified name that starts with a reference to the entity, followed by a .“ ” token, followed by the name of the member. The members inher- Basic Concepts ited from the base class include the constants, fields, methods, properties, events, indexers, 3.operators, and types of the base class, but not the instance constructors, destructors, and static constructors of the base class.

3.4.7 Delegate Members 3

  MulticastDelegate and the members inherited from class .n n฀ Invoke BeginInvoke EndInvokeJoN SkEET The , , and methods mentioned by Delegate MulticastDelegate Vladimir cannot be specified within the or types, as they 3.depend on the parameters and return type of the delegate. The accessibility of a member is established by the declared accessibility (§3.5.1) of the member combined with the acces-sibility of the immediately containing type, if any.

3.5.1 Declared Accessibility

  The intuitive meaning of is “access limited to the containing class or types derived from the containing class.” internal •฀ Internal, which is selected by including an modifier in the member declaration.internal The intuitive meaning of is “access limited to this program.” protected internal a and an modifier in the member declaration. (Note that a type declared as a member of a class can have any of the five kinds of declared accessibility, whereas a type declared as a member of anamespace can have only public or declared accessibility.) n n฀ internal VLADIMIR RESHETNIkoV If a sealed class declares aprotected or protected internal member, a warning is issued.

3.5.2 Accessibility Domains

  Furthermore,the program text of a program is defined as all program text contained in all source files of the program, and the program text of a type is defined as all program text contained in the Basic Concepts type-declarations of that type (including, possibly, types that are nested within the type). When a protected instance member is accessed outside the program text of the class in which it is declared, and when a protected internal instance member is accessed outside the program text of the program in which it is declared, the access must take place withina class declaration that derives from the class in which it is declared.


3.5.3 Protected Access for Instance Members

  Within the class-body of B be a class that derives from D , and let M instance member T , where T instance con- structor of a base class in a constructor-initializer (§10.11.1). or any subclass of Mammal on a Feed() code can call Mammal Then the has a protected method ( Animal , and Reptile and Mammal and two derived classes, ERIC LIPPERT For instance, suppose you have a base classAnimal Basic Concepts 3.


  public class A {Basic Conceptsprotected int x; static void F(A a, B b){ a.x = 1; // Okayb.x = 1; // Okay }} public class B : A{ static void F(A a, B b){ 3.a.x = 1; // Error: must access through instance of B b.x = 1; // Okay Basic Concepts} } A x A B within , it is possible to access through instances of both and , since in either case the A A B access takes place through an instance of or a class derived from . { protected T x;Basic Concepts Basic Concepts } class D<T> : C<T>{ static void F(){ D<T> dt = new D<T>();D<int> di = new D<int>(); D<string> ds = new D<string>();dt.x = default(T); di.x = 123;ds.x = "test"; }}x the three assignments to are permitted because they all take place through instances of class types constructed from the generic type.

3.5.4 Accessibility Constraints

  3.6 Signatures and overloading the params The signature of a method consists of the name of the method, the number of type •฀ parameters, and the type and kind (value, reference, or output) of each of its formalparameters, considered in the order left to right. (This restriction is to allowC# programs to be easily translated to run on the Common Language Infrastructure [CLI], ref out which does not provide a way to define methods that differ solely in and .) object dynamic For the purposes of signatures, the types and are considered the same.object Members declared in a single type cannot, therefore, differ in signature solely by dynamic and .

3. F(int) F(ref int) F(ref int) F(out int)

  However, and cannot ref out be declared within the same interface because their signatures differ solely by and .params Also, note that the return type and the modifier are not part of a signature, so it is not possible to overload solely based on return type or on the inclusion or exclusion of the paramsF(int) F(params string[]) modifier. able were to extend only from its declaration to the end of the block, then in the example Basic Concepts Basic Concepts above, the first assignment would assign to the instance variable and the second assign- ment would assign to the local variable, possibly leading to compile-time errors if the state-ments of the block were later rearranged.

3.7.1 Name Hiding

  The characteristics of the two types of hiding are described in the fol-lowing sections. n n฀ JESSE LIBERTy I would argue that name hiding should always be considered a bug, in that it makes for code that is miserably difficult to maintain and it is always avoidable. Hiding Through Nesting

  { int i = 1;} void G(){ i = 1;} } F i i within the method, the instance variable is hidden by the local variable , but within the G i method, still refers to the instance variable. class A {static void Foo() { } class B{ const int Foo = 1;void Bar() {Foo(); // Okay }} } name as a member from an outer scope, then the member from the outer scope is not always hidden due to the following rule: If the member is invoked, all non-invocablemembers are removed from the set (see §7.3). Hiding Through Inheritance

  Forexample, the above situation might have come about because a later version of Derived in F the declaration of class Base {public void F() { } }class Derived : Base {public void F() { } // Warning: hiding an inherited name } The rules governing operator declarations (§10.10) make it impossible for a derived class to declare an operator with the same signature as an operator in a base class. n n฀Basic Conceptsnew CHRIS SELLS If you find yourself using to hide an instance method on the base class, you’re almost always going to be disappointed, if for no other reason than a caller can simply cast to the base class to get to the “hidden” method.

3.8 Namespace and Type Names Several contexts in a C# program require a namespace-name or a type-name to be specified

  Following resolu- tion as described below, the namespace-or-type-name of a namespace-name must refer to anamespace; otherwise, a compile-time error occurs. Following resolution as described below, the namespace-or-type-name of a type-name must refer to a type; otherwise, Basic Concepts a compile-time error occurs.

3. If the namespace-or-type-name is a qualified-alias-member, its meaning is as described in §9.7

  Otherwise, a namespace-or-type-name has one of four forms: I I<A , , A > •฀ ...1 K N. I<A , , A > •฀ ...1 K I N <A , , A >Basic Concepts where is a single identifier, is a namespace-or-type-name, and ...

3. The meaning of a namespace-or-type-name is determined as follows:

  ing namespace (if any), and ending with the global namespace, the following steps Basic Concepts are evaluated until an entity is located: K I N If the location where the - namespace-or-type-name occurs is enclosed by a N namespace declaration for and the namespace declaration contains an extern- Ialias-directive or using-alias-directive that associates the name with a namespace or type, then the namespace-or-type-name is ambiguous and a compile-time error occurs. N I K Basic Concepts ters, then: K If - is zero and the location where the namespace-or-type-name occurs is enclosed N by a namespace declaration for and the namespace declaration contains an Iextern-alias-directive or using-alias-directive that associates the name with a namespace or type, then the namespace-or-type-name is ambiguous and a com- pile-time error occurs.

3. N

  N Otherwise, if refers to a (possibly constructed) class or struct type and or any of its base classes contain a nested accessible type having name and type parameters, then the namespace-or-type-name refers to that type constructed with the given typearguments. Note that if the meaning of is being determined as part N N of resolving the base class specification of , then the direct base class of is consid- ered to be object (§

3.8.1 Fully Qualified Names 3

  If the object, or any part of it, cannot be accessed by any possible continuation of execu- tion, other than the running of destructors, the object is considered no longer in use, andit becomes eligible for destruction. For instance, if a local variable that is in scope is the only existing reference to an object, but that local variable is never referred to in any possible continuation of execu-tion from the current execution point in the procedure, the garbage collector may (but is not required to) treat the object as no longer in use.

Dokumen baru

Aktifitas terkini

Download (862 Halaman)


Bioethics 4Th Edition Encyclopedia 1551 Pro Wpf 4 5 In C 4Th Edition Concurrent Programming The Java Programming Language Pdf Pdf Courseware For C Programming Language For Beginners Special Edition Using Linux 4Th Edition Pdf Pdf The Object Oriented Thought Process 4Th Edition Pdf Pdf 1642 Javascript For Dummies 4Th Edition 1009 Blogging For Dummies 4Th Edition
Show more