Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 40 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
40
Dung lượng
283,18 KB
Nội dung
In C# there is no direct distinction between a Sub and a Function, and members are just implemented as functions (that may, or may not, return data) The syntax is: [ public | protected | internal | protected internal | private | static | virtual | override | abstract | extern ] [ type | void ] memberName([parameters]) { } The various keywords are described below: Keyword Description public The member is publicly accessible protected The member is only accessible from the containing class or types derived from the containing member internal The member is only accessible from this program Equivalent to Friend in Visual Basic Table continued on following page Keyword Description protected The member is only accessible from this program, or types derived from the containing member internal Equivalent to Protected Friend in Visual Basic private The member is only accessible from within the containing member The member is shared by all instances of the class, and exists independently of a class instance static virtual Equivalent to Shared in Visual Basic The member can be overridden by a sub-class The member overrides an identically named member from a base class, with the same signature The override base class member must be defined as virtual, abstract or override abstract This member is an abstract member, and must be implemented by a sub-class extern The member is implemented in an external assembly For example: public class calculator { public double Add(double op1, double op2) { return op1 + op2; } } For a method that does not return a result, we declare the type as void: public void updateSomething() { } Properties Properties in C# are very similar to Visual Basic NET, and can be implemented as public member variables or by using the property accessors For example, the following uses public variables: public class calculator { public double Op1; public double Op2; public double Add() { return Op1 + Op2; } } The alternative (and preferred) approach is to use property accessors For example: public class calculator { private double _op1; private double _op2; public double Operand1 { get { return _op1; } set { _op1 = value; } } public double Operand2 { get { return _op2; } set { _op2 = value; } } } Unlike Visual Basic, there are no specific keywords to identify read- and write-only properties If only the get accessor is provided then the property is read-only, and if only the set accessor is provided then the property is write-only Both accessors imply a read/write property Constructors Rather than using New for constructors, the C# syntax is to use a method with the same name as the class For example: public class person { private string _firstName; private string _lastName; public person() {} public person(string firstName, string lastName) { _firstName = firstName; _lastName = lastName; } public string FirstName { // property accessors here } public string LastName { // property accessors here } } Destructors For destructors there is no Destruct keyword This functionality is provided by a method with the same name as the class, but with a tilde (~) in front of it For example: public class person { private string _firstName; private string _lastName; public person() {} public person(string firstName, string lastName) { } ~person() { // destructor code here } } Like Visual Basic NET, destructors in C# are called by the garbage collector, and are not guaranteed to be executed at the time you destroy the class Inheritance Inheritance in C# looks more like C++, where a colon (:) is used to separate the class and the base class For example: public class programmer : person { private int _avgHoursSleepPerNight; public programmer(): base() { } public programmer(string firstName, string lastName): base(firstName, lastName) { } public programmer(string firstName, string lastName, int hoursSleep): base(firstName, lastName) { _avgHoursSleepPerNight = hoursSleep; } public int AvgHoursSleepPerNight { get { return _avgHoursSleepPerNight; } set { _avgHoursSleepPerNight = value; } } } The class definition defines that our class is called programmer and the base class is called person: public class programmer : person { Next we need to provide the constructors Here we specify the same constructors as the base class, and use the same inheritance syntax (the :) to indicate that this method inherits its implementation from the base class Any parameters should be passed to the base class constructor public programmer(): base() { } public programmer(string firstName, string lastName): base(firstName, lastName) { } To declare an additional constructor we follow the same rules, invoking the base constructor, but also providing additional functionality: public programmer(string firstName, string lastName, int hoursSleep): base(firstName, lastName) { _avgHoursSleepPerNight = hoursSleep; } And finally we have the new property: public int AvgHoursSleepPerNight { get { return _avgHoursSleepPerNight; } set { _avgHoursSleepPerNight = value; } } } The value keyword is implemented automatically by the CLR, providing the property with the supplied value from the calling program Interfaces Interfaces work the same as in Visual Basic NET, providing an immutable contract to the external world To create an interface, we use the interface construct For example: public interface IPerson { string FirstName(get; set;) string LastName(get; set;) string FullName(); } To derive a class from an interface, we use the same method as inheritance: public class Person : IPerson { private string _firstName; private string _lastName; public string FirstName() { // implementation goes here } public string LastName() { // implementation goes here } Properties Like both Visual Basic and C#, JScript NET properties can be accessed as public variables, or by accessor functions For example, here we're using public variables: public class calculator { public var Op1 : double; public var Op2 : double; public function Add() : double { return Op1 + Op2; } } The alternative, and preferred approach, is to use property accessors For example: public class calculator { private var _op1 : double; private var _op2 : double; public function get Operand1() : double { return _op1; } public function set Operand1(value: double) { _op1 = value; } public function get Operand2() : double { return _op2; } public function set Operand2(value: double) { _op2 = value; } } Like C#, the read/write ability of a property in JScript NET is determined by the accessor functions Therefore, if only a get function is provided, the property will be read only Constructors Like C#, the JScript NET syntax for class constructors is to use a method with the same name as the class For example: public class person { private var _firstName : string; private var _lastName : string; public function person() {} public function person(firstName : string, lastName : string) { _firstName = firstName; _lastName = lastName; } } Destructors JScript NET does not have explicit destructors To implement this type of behavior you need to create a method and ensure that this method is called before you destroy the object instance Inheritance JScript NET uses the extends keyword to inherit from classes For example: public class programmer extends person { private var _avgHoursSleepPerNight : int; public function programmer() { super(); } public function programmer(firstName : String, lastName : String) { super(firstName, lastName); } public function programmer(firstName : String, lastName : String, hoursSleep: int) { super(firstName, lastName); _avgHoursSleepPerNight = hoursSleep; } public function get AvgHoursSleepPerNight() : int { return _avgHoursSleepPerNight; } public function set AvgHoursSleepPerNight(a : int) { _avgHoursSleepPerNight = a; } } The class definition defines that our class is called programmer and the base class is called person: public class programmer extends person Next, we need to provide the constructors Here we specify the same constructors as the base class, and use the super keyword (meaning superclass) to call the method of the base class Any parameters are passed to the base class constructor: public function programmer() { super(); } public function programmer(firstName : String, lastName : String) { super(firstName, lastName); } In JScript NET the overridden classes must have the same signature (number and type of parameters) as the base class We cannot declare local methods with the same name but different parameters - that is, shadowing is only supported where the signatures match Interfaces Interfaces work the same way as in Visual Basic NET, providing an immutable contract to the external world To create an interface we use the interface construct For example: public interface IPerson { public function get FirstName() : String public function set FirstName(value:String) public function get LastName() : String public function set LastName(value:String) public function FullName() : String; } To derive a class from an interface we use the implements keyword in the following way: public class Person implements IPerson { private var _firstName : String; private var _lastName : String; public function get FirstName() : String { // implementation goes here } public function set FirstName(value:String) { // implementation goes here } } Notice that, unlike Visual Basic NET, only the class needs to specify the interface inheritance References To include references we use import For example: import System; import MyComponent; We cannot alias references in JScript NET Directives Three directives have been introduced to bring supported CLR features to the JScript programmer All three are set using the @set directive, the syntax of which is: @set @directive(arguments) The first directive is for debugging: @set @debug(on | off) Debugging is set to on by default, and allows hosting environments (such as ASP.NET) to emit their own code into the actual compiled code The second directive is to enable CLS compliance: @set @option(fast) When the fast option is enabled: All variables must be declared We cannot redefine functions We cannot assign values to functions We cannot assign, delete, or change the predefined values of built-in objects Expanded properties are not allowed on built-in objects except for the global object The correct number of arguments must be supplied to function calls We cannot use the arguments property within function calls The third directive enables us to provide positional information for debugging messages This is useful because the code that's executed might not be the same as the code written This occurs because some environments (such as ASP.NET) might emit their own code into the program So, when errors occur, the line number it's reported on might not match up to the lines in our code This directive takes the form: @set @position(end | [file = name] [,line = lineNum] [, column = columnNum]) For example, if the environment adds extra code at the beginning of our file, we could add the following: @set @position(line=1) This ensures that the line numbers emitted by errors match with our files Other enhancements Two other enhancements to JScript are the addition of constants and enumerations Constants are declared using the const statement: const variableName = value; const variableName : type = value; For example: const age = 18 const age : int = 18; Enumerations are declared using the enum statement: enum enumName [: type] { name [= value[ [, name [= value]] [, …]]] } For example: enum days : int { Mon, Tue, Wed, Thu, Fri, Sat, Sun } If no values are explicitly given, the names are assigned incremental values starting at So, this gives Mon the value of 0, Tue the value of 1, and so on Alternatively, you can specify a value anywhere in the list, and the incrementation continues from that value: enum days : int { Mon=1, Tue, Wed, Thu=9, Fri, Sat, Sun } This gives the following: Name Value Mon Tue Wed Thu Fri 10 Sat 11 Sun 12 C++ Since C++ already has object-oriented features, the VC++ implementation supplied with Visual Studio NET provides support for managed code At the minimum, we must include the following two lines at the top of our code: #using using namespace System; These give us access to the NET classes We must also add the /CLR compiler option when building the executable Details of working with the managed extensions for C++ are really outside the scope of this book, so you should consult the documentation for more details Visual J# NET Although the NET framework is a released product, there are languages still under development Late in the beta process, Microsoft announced their Java User Migration Path (JUMP), to allow Java developers to build NET applications This is not only aimed at Java developers using Microsoft's J++ development tool, but at third party Java developers too As part of this, the Visual J# NET toolkit provides a tool to convert Java sourcecode into J#, migrating the language and library calls It fully integrates with Visual Studio NET, and supports the Microsoft extensions that J++ supported One important point to note is that applications developed with J# will only run within NET This isn't a Java virtual machine, but comprises tools and compilers for the NET framework As such it doesn't produce Java byte code, and is not endorsed by Sun Microsystems Other Supported Languages We've already mentioned that the open design of NET actively encourages the use of other languages, and Microsoft is keen for this to happen At the time of writing, the following languages were also becoming available: Dyalog APL/W Version Fujitsu COBOL Component Pascal Eiffel Haskell Mercury Oberon Perl Python Scheme Standard ML There are others in the pipeline, and the best resource is http://www.gotdotnet.com, which contains an up-to-date list of languages If you're into building your own languages, then the SDK comes with some good sample compilers that show you how you can this They are in the Tool Developers Guide There's also plenty of documentation about assemblies, IL, and so on The NET Language Compilers When working within the Visual Studio NET environment, we don't need to worry about the compiler, because the editor takes care of all that for us Likewise, when simply developing ASP.NET pages, we can rely on the framework to compile pages as required However, when building components or controls, we'd want to compile code into a DLL, so we need to know how the compiler works There is a separate compiler for each language, but luckily you use them all in the same way, and most of the switches and flags are identical The compilers are: csc for C# vbc for Visual Basic NET jsc for JScript NET These are automatically part of the NET installation, and are invoked from the command line For example: vbc /t:library /out: \bin\People.dll /r:system.dll person.vb programmer.vb This compiles the person.vb and programmer.vb source files into an assembly named People.dll Compiler switches fall into two usage categories The first includes those that enable or disable an option: in this case, the switch or the switch name followed by plus enables the option, and the switch name followed by minus disables it For example: /cls enables the option /cls+ enables the option /cls- disables the option The second category contains switches that specify a file or reference In these cases a colon (:) separates the switch and the argument For example: /out: \bin\People.dll The full list of options is shown below, including a list of which languages the option is supported in: Option Language Description @ All Specify the file containing the compiler options /?/help All Display the options, without compiling any code /addmodule:module VB / C# Reference metadata from the specified module /autoref JScript /baseaddress:number VB / C# Automatically reference assemblies based on imported namespaces and fully-qualified names This defaults to on Specify, as a hexadecimal number, the base address of the DLL /bugreport:file VB / C# Create a file containing information that can be used when filing bug reports /checked C# Generate overflow checks JScript / /codepage:id /debug C# All Specify the code page id used in source files Add debugging information to the created file This is required if you need to debug into components Define conditional compiler constants You can define multiple constants by /define:symbols All separating them with commas For example:/define:DBTracing=True,CustomErrors=False /doc:file C# Emit the XML documentation in the source files into the named file /delaysign VB Delay-sign the assembly, using only the public part of the strong name key /fast JScript Disable language features to allow better code generation /filealign:n C# Specify the alignment used for output file sections /fullpaths C# Generate fully qualified paths Option Language Description /imports:list VB Import a namespace from the specified assembly /incr/incremental C# Enable or disable incremental compilation Create a unique container name for a key Used when generating shared components, as it inserts a public key /keycontainer VB into the assembly manifest, and signs the assembly with the private key This can be used with the sn utility, which manages keys Specify the file containing the public and private keys to VB /keyfile be added to a shared component This can be used with the sn utility, which manages keys JScript /lcid:id C# / /lib:directories JScript VB /libpath:directories Use the specified locale id for the default code page and messages Specify additional directories to search for references Specify additional directories to search for references Create a link to a resource file The first argument is the /linkres:resinfo/linkresource:resinfo All file name containing the resource, and an optional second argument specifies the identifier in the resource file For example:/linkresource:Wrox.resource,AuthorBio Specify the class or module type that contains the main /m:type/main:type C# / VB /noconfig C# /nologo C# / VB /nowarn VB Disable warnings C# / Enable or disable the import of the standard library JScript mscorlib.dll compilation /nowarn:list C# Disable warning messages specified in the list /optimize C# / VB Enable or disable compiler optimizations /nostdlib start-up procedure Do not auto include CSC.RSP file Don't show the copyright banner during compile This makes it a lot easier to see compilation messages Option Language Description /optioncompare:type VB /optionexplicit VB Specify the type of comparison used for strings The values are text or binary (the default) For example:/optioncompare:text Enable (the default) or disable explicit variable declaration Enables (the default) or disables strict type conversions In strict /optionstrict VB mode the only implicit conversions are those that widen types (for example an integer to a long) Specify the name of the output file By default a DLL will take its /out:file All name from the first sourcecode file, and an EXE will take its name from the file containing the main procedure /print JScript Enable or disable provision of the print() function /quiet VB Quiet output mode /recurse:wildcard C# / VB /r:list/reference:list All Recurse through subdirectories compiling files For example:vbc /target:library /out:Foo.dll /recurse:inc\*.vb Reference metadata from the specified file list For multiple files use a semi-colon (;) to separate them /removeintchecks Enable or disable (the default) overflow error checking for integer VB variables Embed a resource into the assembly The first argument is the file name containing the resource, and an optional second argument /res:resinfo/resource:resinfo All specifies the identifier in the resource file For example:/resource:Wrox.resource,AuthorBio /rootnamespace Option VB Indicate the namespace in which all type declarations will appear Language Description Indicate the type of file to be created This can be one of:- exe, /target:type All for a console application- library, for a DLL- module, for a module- winexe, for a Windows application- The module option is not applicable in JScript NET /time C# Display the project compile times /unsafe C# Enable or disable unsafe code /utf8output All Output compiler messages in UTF-8 encoding /verbose VB Enable or disable verbose error and information messages /versionsafe JScript C# / /w:n/warn:n JScript Enable or disable specification of default for members that aren't marked as override or new Set the warning level to n /warnaserror All Enable or disable the treatment of warnings as errors /win32icon:file C# / VB Specify the icon file (.ico) to be added to the resource /win32res:file/win32resource:file All Insert a Win32 resource file into the target Benefits of a Common Language Runtime Let's quickly remind ourselves of the points made in the previous chapter about languages: Language functionality: the choice of language is now a lifestyle choice, rather than a functionality choice, as they are all equivalent Use whatever language you are happiest with Performance: the NET languages were designed to provide high performance The only difference between the languages is at the compilation stage, where compilers may produce slightly different MSIL Platform Support: the languages sit on top of the Common Language Runtime, so if the CLR is available on a platform, then so are the NET languages For small device support and 64-bit platforms this makes portability far easier than with previous Windows languages ... As an ASP.NET developer it''s unlikely you''ll ever need this, but knowing it''s available gives us the flexibility to choose, should the need arise Consult the C# documentation or Wrox''s Professional. .. the /doc compiler switch (more on these later), which produces the file like so: PeopleCS ... + c2.real, c1.imag + c2.imag); } This provides a much more intuitive way of developing, and is especially useful when building class libraries for other developers JScript NET Like Visual Basic,