You are on page 1of 9

1. Keywords are predefined, reserved identifiers that have special meanings to the compiler. 2.

A contextual keyword is used to provide a specific meaning in the code, but it is not a reserved
word in C#.

3. The abstract modifier indicates that the thing being modified has a missing or incomplete
implementation. The abstract modifier can be used with classes, methods, properties, indexers, and events. Use the abstract modifier in a class declaration to indicate that a class is intended only to be a base class of other classes. Members marked as abstract, or included in an abstract class, must be implemented by classes that derive from the abstract class. 4. Abstract classes have the following features: a. An abstract class cannot be instantiated. b. An abstract class may contain abstract methods and accessors. c. It is not possible to modify an abstract class with the sealed (C# Reference) modifier because the two modifers have opposite meanings. The sealedmodifier prevents a class from being inherited and the abstract modifier requires a class to be inherited. d. A non-abstract class derived from an abstract class must include actual implementations of all inherited abstract methods and accessors. 5. In addition to the arithmetic operators, integral-type to integral-type casts can cause overflow, for example, casting a long to an int, and are subject to checked or unchecked execution. However, bitwise operators and shift operators never cause overflow.

6. The dot operator (.) is used for member access. The dot operator specifies a member of a type or
namespace.

7. Square brackets ([]) are used for arrays, indexers, and attributes. They can also be used with
pointers. 8. 9. An abstract class must provide implementation for all interface members. Access modifiers are keywords used to specify the declared accessibility of a member or a type. This section introduces the four access modifiers: a. public b. protected c. internal d. private 10. Modifiers are used to modify declarations of types and type members.

11. The const keyword is used to modify a declaration of a field or local variable. 12. A constant expression is an expression that can be fully evaluated at compile time. Therefore, the
only possible values for constants of reference types are stringand null.

13. 14. 15. 16.

The constant declaration can declare multiple constants The static modifier is not allowed in a constant declaration. The event keyword is used to declare an event in a publisher class. Events are a special kind of multicast delegate that can only be invoked from within the class or struct where they are declared (the publisher class). If other classes or structs subscribe to the event, their event handler methods will be called when the publisher class raises the event.

17. Events can be marked as public, private, protected, internal, or protected internal. 18. The extern modifier is used to declare a method that is implemented externally.

19. The extern keyword can also define an external assembly alias, which makes it possible to
reference different versions of the same component from within a single assembly.

20. The extern keyword has more limited uses than in C++. 21. For generic type parameters, the in keyword specifies that the type parameter is contravariant.
You can use the in keyword in generic interfaces and delegates.

22. A type can be declared contravariant in a generic interface or delegate if it is used only as a type
of method arguments and not used as a method return type. Refand out parameters cannot be variant.

23. An interface that has a contravariant type parameter allows its methods to accept arguments of
less derived types than those specified by the interface type parameter.

24. A contravariant delegate can be assigned another delegate of the same type, but with a less
derived generic type parameter.

25. For generic type parameters, the out keyword specifies that the type parameter is covariant. You
can use the out keyword in generic interfaces and delegates.

26. Covariance enables you to use a more derived type than that specified by the generic parameter.
This allows for implicit conversion of classes that implement variant interfaces and implicit conversion of delegate types. Covariance and contravariance are supported for reference types, but they are not supported for value types.

27. An interface that has a covariant type parameter enables its methods to return more derived
types than those specified by the type parameter.

28. A covariant delegate can be assigned another delegate of the same type, but with a more derived
generic type parameter.

29. In a generic interface, a type parameter can be declared covariant if it satisfies the following
conditions:

a. The type parameter is used only as a return type of interface methods and not used as a
type of method arguments.

b. The type parameter is not used as a generic constraint for the interface methods. 30. In a generic delegate, a type can be declared covariant if it is used only as a method return type
and not used for method arguments.

31. The override modifier is required to extend or modify the abstract or virtual implementation of
an inherited method, property, indexer, or event.

32. An override method provides a new implementation of a member that is inherited from a base
class. The method that is overridden by an override declaration is known as the overridden base method. The overridden base method must have the same signature as the override method.

33. You cannot override a non-virtual or static method. The overridden base method must
be virtual, abstract, or override.

34. An override declaration cannot change the accessibility of the virtual method. Both
the override method and the virtual method must have the same access level modifier.

35. You cannot use the new, static, or virtual modifiers to modify an override method. 36. An overriding property declaration must specify exactly the same access modifier, type, and name
as the inherited property, and the overridden property must be virtual, abstract, or override.

37. The readonly keyword is a modifier that you can use on fields. When a field declaration includes
a readonly modifier, assignments to the fields introduced by the declaration can only occur as part of the declaration or in a constructor in the same class.

38. The readonly keyword is different from the const keyword. A const field can only be initialized at
the declaration of the field. A readonly field can be initialized either at the declaration or in a constructor. Therefore, readonly fields can have different values depending on the constructor used. Also, while aconst field is a compile-time constant, the readonly field can be used for runtime constants

39. When applied to a class, the sealed modifier prevents other classes from inheriting from it. In the following example, class B inherits from class A, but no class can inherit from class B. 40. You can also use the sealed modifier on a method or property that overrides a virtual method or
property in a base class. This enables you to allow classes to derive from your class and prevent them from overriding specific virtual methods or properties.

41. It is an error to use the abstract modifier with a sealed class, because an abstract class must be
inherited by a class that provides an implementation of the abstract methods or properties. 42. When applied to a method or property, the sealed modifier must always be used with override. Because structs are implicitly sealed, they cannot be inherited. 43. Use the static modifier to declare a static member, which belongs to the type itself rather than to a specific object. The static modifier can be used with classes, fields, methods, properties, operators, events, and constructors, but it cannot be used with indexers, destructors, or types other than classes. 44. A constant or type declaration is implicitly a static member. 45. A static member cannot be referenced through an instance. Instead, it is referenced through the type name. 46. While an instance of a class contains a separate copy of all instance fields of the class, there is only one copy of each static field. It is not possible to use this to reference static methods or property accessors. If the static keyword is applied to a class, all the members of the class must be static. Classes and static classes may have static constructors. Static constructors are called at some point between when the program starts and the class is instantiated. 47. The unsafe keyword denotes an unsafe context, which is required for any operation involving pointers.

48. You can use the unsafe modifier in the declaration of a type or a member. The entire textual
extent of the type or member is therefore considered an unsafe context.

49. The scope of the unsafe context extends from the parameter list to the end of the method, so
pointers can also be used in the parameter list. You can also use an unsafe block to enable the use of an unsafe code inside this block. To compile unsafe code, you must specify the /unsafe compiler option. Unsafe code is not verifiable by the common language runtime.

50. The virtual keyword is used to modify a method, property, indexer, or event declaration and allow
for it to be overridden in a derived class.

51. The implementation of a virtual member can be changed by an overriding member in a derived
class. 52. When a virtual method is invoked, the run-time type of the object is checked for an overriding member. The overriding member in the most derived class is called, which might be the original member, if no derived class has overridden the member.

53. By default, methods are non-virtual. You cannot override a non-virtual method. You cannot use the virtual modifier with the static, abstract, private, or override modifiers. 54. Virtual properties behave like abstract methods, except for the differences in declaration and invocation syntax. a. It is an error to use the virtual modifier on a static property. b. A virtual inherited property can be overridden in a derived class by including a property declaration that uses the override modifier. 55. Variables that are value types store data, and those that are reference types store references to the actual data. Reference types are also referred to as objects. Pointer types can be used only in unsafe mode. 56. It is possible to convert a value type to a reference type, and back again to a value type, by using boxing and unboxing. With the exception of a boxed value type, you cannot convert a reference type to a value type. 57. The value types consist of two main categories: a. Structs b. Enumerations 58. Variables that are based on value types directly contain values. Assigning one value type variable to another copies the contained value. This differs from the assignment of reference type variables, which copies a reference to the object but not the object itself. All value types are derived implicitly from the System.ValueType. Unlike with reference types, you cannot derive a new type from a value type. However, like reference types, structs can implement interfaces. Unlike reference types, a value type cannot contain the null value. However, the nullable types feature does allow for values types to be assigned to null. Each value type has an implicit default constructor that initializes the default value of that type. For information about default values of value types, see Default Values Table. 59. Constant expressions, whose operands are all simple type constants, are evaluated at compilation time. Simple types can be initialized by using literals. 60. The default value of a bool variable is false. The default value of a bool? variable is null.

61. In C#, there is no conversion between the bool type and other types.
62. There is a predefined implicit conversion from byte to short, ushort, int, uint, long, ulong, float, double, or decimal. 63. You cannot implicitly convert non-literal numeric types of larger storage size to byte. 64. A char can be implicitly converted to ushort, int, uint, long, ulong, float, double, or decimal. However, there are no implicit conversions from other types to thechar type. 65. The System.Char type provides several static methods for working with char values. 66. The integral types are implicitly converted to decimal and the result evaluates to decimal. Therefore you can initialize a decimal variable using an integer literal, without the suffix. There is no implicit conversion between floating-point types and the decimal type; therefore, a cast must be used to convert between these two types.

67. You can also mix decimal and numeric integral types in the same expression. However,
mixing decimal and floating-point types without a cast causes a compilation error.

68. The double keyword signifies a simple type that stores 64-bit floating-point values. 69. You can mix numeric integral types and floating-point types in an expression. In this case, the
integral types are converted to floating-point types. The evaluation of the expression is performed according to the following rules: If one of the floating-point types is double, the expression evaluates to double, or bool in relational or Boolean expressions. If there is

no double type in the expression, it evaluates to float, or bool in relational or Boolean expressions. 70. The enum keyword is used to declare an enumeration, a distinct type that consists of a set of named constants called the enumerator list. Usually it is best to define an enum directly within a namespace so that all classes in the namespace can access it with equal convenience. However, an enum can also be nested within a class or struct. 71. By default, the first enumerator has the value 0, and the value of each successive enumerator is increased by 1. Enumerators can use initializers to override the default values. 72. By default, a real numeric literal on the right side of the assignment operator is treated as double. Therefore, to initialize a float variable, use the suffix f or F. 73. The evaluation of the expression is performed according to the following rules: a. If one of the floating-point types is double, the expression evaluates to double or bool in relational or Boolean expressions. b. If there is no double type in the expression, the expression evaluates to float or bool in relational or Boolean expressions. 74. When an integer literal has no suffix, its type is the first of these types in which its value can be represented: int, uint, long, ulong. 75. There is a predefined implicit conversion from sbyte, byte, short, ushort, or char to int. 76. A struct type is a value type that is typically used to encapsulate small groups of related variables, such as the coordinates of a rectangle or the characteristics of an item in an inventory. 77. Structs can also contain constructors, constants, fields, methods, properties, indexers, operators, events, and nested types, although if several such members are required, you should consider making your type a class instead. 78. Structs can implement an interface but they cannot inherit from another struct. For that reason, struct members cannot be declared as protected. 79. In the preceding declaration, the integer literal 32767 is implicitly converted from int to short. If the integer literal does not fit into a short storage location, a compilation error will occur. 80. A cast must be used when calling overloaded methods. 81. You cannot implicitly convert nonliteral numeric types of larger storage size to short for the storage sizes of integral types) 82. A selection statement causes the program control to be transferred to a specific flow based upon whether a certain condition is true or not. 83. The switch statement is a control statement that selects a switch section to execute from a list of candidates. 84. Each switch section contains one or more case labels and a list of one or more statements. 85. A switch statement can include any number of switch sections, and each section can have one or more case labels. However, no two case labels can contain the same constant value. 86. Execution of the statement list in the selected section begins with the first statement and proceeds through the statement list, typically until a jump statement is reached, such as a break, goto case, return, or throw. At that point, control is transferred outside the switch statement or to another case label. 87. Unlike C++, C# does not allow execution to continue from one switch section to the next. 88. You can create loops by using the iteration statements. Iteration statements cause embedded statements to be executed a number of times, subject to the loop-termination criteria. These statements are executed in order, except when a jump statement is encountered. 89. The do statement executes a statement or a block of statements repeatedly until a specified expression evaluates to false.

90. Unlike the while statement, a do-while loop is executed one time before the conditional expression is evaluated. 91. At any point in the do-while block, you can break out of the loop using the break statement. You can step directly to the while expression evaluation statement by using the continue statement. If the while expression evaluates to true, execution continues at the first statement in the loop. If the expression evaluates to false, execution continues at the first statement after the dowhile loop. 92. A do-while loop can also be exited by the goto, return, or throw statements. 93. The for loop executes a statement or a block of statements repeatedly until a specified expression evaluates to false. The for loop is useful for iterating over arrays and for sequential processing. 94. The for statement executes the enclosed statement or statements repeatedly as follows: a. First, the initial value of the variable i is evaluated. b. Then, as long as the value of i is less than or equal to 5, the condition evaluates to true, the Console.WriteLine statement is executed and i is reevaluated. c. When i is greater than 5, the condition becomes false and control is transferred outside the loop. 95. Because the test of a conditional expression occurs before the execution of the loop, a for statement executes zero or more times. 96. You can break out of the loop by using the break keyword, or step to the next iteration in the loop by using the continue keyword. You also can exit the loop by using a goto, return, or throw statement. 97. All of the expressions of the for statement are optional 98. The foreach statement repeats a group of embedded statements for each element in an array or an object collection that implements the interface. The foreach statement is used to iterate through the collection to get the information that you want, but can not be used to add or remove items from the source collection to avoid unpredictable side effects. If you need to add or remove items from the source collection, use a for loop. 99. The embedded statements continue to execute for each element in the array or collection. After the iteration has been completed for all the elements in the collection, control is transferred to the next statement following the foreach block. 100. At any point within the foreach block, you can break out of the loop by using the break keyword, or step to the next iteration in the loop by using the continue keyword. 101. A foreach loop can also be exited by the goto, return, or throw statements. 102. The while statement executes a statement or a block of statements until a specified expression evaluates to false. 103. Because the test of the while expression takes place before each execution of the loop, a while loop executes zero or more times. This differs from the do loop, which executes one or more times. 104. A while loop can be terminated when a break, goto, return, or throw statement transfers control outside the loop. To pass control to the next iteration without exiting the loop, use the continue statement. Notice the difference in output in the three previous examples, depending on where int n is incremented. 105. Branching is performed using jump statements, which cause an immediate transfer of the program control. 106. The break statement terminates the closest enclosing loop or switch statement in which it appears. Control is passed to the statement that follows the terminated statement, if any. 107. The continue statement passes control to the next iteration of the enclosing iteration statement in which it appears.

108. The goto statement transfers the program control directly to a labeled statement. 109. A common use of goto is to transfer control to a specific switch-case label or the default label in a switch statement. 110. The goto statement is also useful to get out of deeply nested loops. 111. The return statement terminates execution of the method in which it appears and returns control to the calling method. It can also return an optional value. If the method is a void type, the return statement can be omitted. 112. If the return statement is inside a try block, the finally block, if one exists, will be executed before control returns to the calling method. 113. C# provides built-in support for handling anomalous situations, known as exceptions, which may occur during the execution of your program. These exceptions are handled by code that is outside the normal flow of control. 114. The throw statement is used to signal the occurrence of an anomalous situation (exception) during the program execution. 115. The thrown exception is an object whose class is derived from System.Exception 116. Usually the throw statement is used with try-catch or try-finally statements. 117. The try-catch statement consists of a try block followed by one or more catch clauses, which specify handlers for different exceptions. When an exception is thrown, the common language runtime (CLR) looks for the catch statement that handles this exception. If the currently executing method does not contain such a catchblock, the CLR looks at the method that called the current method, and so on up the call stack. If no catch block is found, then the CLR displays an unhandled exception message to the user and stops execution of the program. 118. The try block contains the guarded code that may cause the exception. The block is executed until an exception is thrown or it is completed successfully. 119. Although the catch clause can be used without arguments to catch any type of exception, this usage is not recommended. In general, you should only catch those exceptions that you know how to recover from. Therefore, you should always specify an object argument derived from System.Exception 120. It is possible to use more than one specific catch clause in the same try-catch statement. In this case, the order of the catch clauses is important because the catchclauses are examined in order. Catch the more specific exceptions before the less specific ones. The compiler produces an error if you order your catch blocks so that a later block can never be reached. 121. A throw statement can be used in a catch block to re-throw the exception that is caught by the catch statement. 122. The finally block is useful for cleaning up any resources that are allocated in the try block, and for running any code that must execute even if an exception occurs in the try block. Typically, the statements of a finally block are executed when control leaves a try statement, whether the transfer of control occurs as a result of normal execution, of execution of a break, continue, goto, or return statement, or of propagation of an exception out of the try statement. 123. Within a handled exception, the associated finally block is guaranteed to be run. However, if the exception is unhandled, execution of the finally block is dependent on how the exception unwind operation is triggered. That, in turn, is dependent on how your computer is set up. 124. Usually, when an unhandled exception ends an application, whether or not the finally block is run is not important. However, if you have statements in a finallyblock that must be run even in that situation, one solution is to add a catch block to the tryfinally statement. Alternatively, you can catch the exception that might be thrown in the try block

of a try-finally statement higher up the call stack. That is, you can catch the exception in the method that calls the method that contains the try-finally statement, or in the method that calls that method, or in any method in the call stack. If the exception is not caught, execution of the finally block depends on whether the operating system chooses to trigger an exception unwind operation. 125. A common usage of catch and finally together is to obtain and use resources in a try block, deal with exceptional circumstances in a catch block, and release the resources in the finally block. 126. C# statements can execute in either checked or unchecked context. In a checked context, arithmetic overflow raises an exception. In an unchecked context, arithmetic overflow is ignored and the result is truncated. 127. If neither checked nor unchecked is specified, the default context depends on external factors such as compiler options. a. Expressions using the following predefined operators on integral types: ++ - (unary) + - * / b. Explicit numeric conversions between integral types. 128. The checked keyword is used to explicitly enable overflow checking for integral-type arithmetic operations and conversions. 129. By default, an expression that contains only constant values causes a compiler error if the expression produces a value that is outside the range of the destination type. If the expression contains one or more non-constant values, the compiler does not detect the overflow. 130. By default, these non-constant expressions are not checked for overflow at run time either, and they do not raise overflow exceptions. The previous example displays -2,147,483,639 as the sum of two positive integers. 131. Overflow checking can be enabled by compiler options, environment configuration, or use of the checked keyword. 132. The unchecked keyword can be used to prevent overflow checking. 133. The unchecked keyword is used to suppress overflow-checking for integral-type arithmetic operations and conversions. 134. In an unchecked context, if an expression produces a value that is outside the range of the destination type, the overflow is not flagged. 135. If the unchecked environment is removed, a compilation error occurs. The overflow can be detected at compile time because all the terms of the expression are constants. 136. Expressions that contain non-constant terms are unchecked by default at compile time and run time. 137. Because checking for overflow takes time, the use of unchecked code in situations where there is no danger of overflow might improve performance. However, if overflow is a possibility, a checked environment should be used. 138. The fixed statement prevents the garbage collector from relocating a movable variable. The fixed statement is only permitted in an unsafe context. Fixed can also be used to create fixed size buffers. 139. The fixed statement sets a pointer to a managed variable and "pins" that variable during the execution of the statement. Without fixed, pointers to movable managed variables would be of little use since garbage collection could relocate the variables unpredictably. The C# compiler only lets you assign a pointer to a managed variable in a fixed statement. 140. Pointers initialized in fixed statements cannot be modified.

141. The lock keyword marks a statement block as a critical section by obtaining the mutualexclusion lock for a given object, executing a statement, and then releasing the lock. 142.

You might also like