zoukankan      html  css  js  c++  java
  • Some Noteable Diffs Between C++ and C#

    1. Can I use typedefs in C#?

    No, C# has no direct equivalent of the C++ typedef. C# does allow an alias to be specified via the using keyword:

     using IntList = System.Collections.Generic.List<int>;

    but the alias only applies in the file in which it is declared. A workaround in some cases is to use inheritance:

     public class IntList : List<int> { }

    The pros and cons of this approach are discussed here.

    2. Structs are largely redundant in C++. Why does C# have them?

    In C++, a struct and a class are pretty much the same thing. The only difference is the default visibility level (public for structs, private for classes). However, in C# structs and classes are very different. In C#, structs are value types (instances stored directly on the stack, or inline within heap-based objects), whereas classes are reference types (instances stored on the heap, accessed indirectly via a reference). Also structs cannot inherit from structs or classes, though they can implement interfaces. Structs cannot have destructors. A C# struct is much more like a C struct than a C++ struct.

    3. Are C# constructors the same as C++ constructors?

    Very similar, but there are some significant differences. First, C# supports constructor chaining. This means one constructor can call another:

     class Person
    {
    public Person( string name, int age ) { ... }
    public Person( string name ) : this( name, 0 ) {}
    public Person() : this( "", 0 ) {}
    }

    Another difference is that virtual method calls within a constructor are routed to the most derived implementation - see Can I Call a virtual method from a constructor.

    Error handling is also somewhat different. If an exception occurs during construction of a C# object, the destuctor (finalizer) will still be called. This is unlike C++ where the destructor is not called if construction is not completed. (Thanks to Jon Jagger for pointing this out.)

    Finally, C# has static constructors. The static constructor for a class runs before the first instance of the class is created.

    Also note that (like C++) some C# developers prefer the factory method pattern over constructors. See Brad Wilson's article.

    4. Can I call a virtual method from a constructor/destructor?

    Yes, but it's generally not a good idea. The mechanics of object construction in .NET are quite different from C++, and this affects virtual method calls in constructors.

    C++ constructs objects from base to derived, so when the base constructor is executing the object is effectively a base object, and virtual method calls are routed to the base class implementation. By contrast, in .NET the derived constructor is executed first, which means the object is always a derived object and virtual method calls are always routed to the derived implementation. (Note that the C# compiler inserts a call to the base class constructor at the start of the derived constructor, thus preserving standard OO semantics by creating the illusion that the base constructor is executed first.)

    The same issue arises when calling virtual methods from C# destructors. A virtual method call in a base destructor will be routed to the derived implementation.

    5. Are C# destructors the same as C++ destructors?

    No. They look the same but they are very different. The C# destructor syntax (with the familiar ~ character) is just syntactic sugar for an override of the System.Object Finalize method. This Finalize method is called by the garbage collector when it determines that an object is no longer referenced, before it frees the memory associated with the object. So far this sounds like a C++ destructor. The difference is that the garbage collector makes no guarantees about when this procedure happens. Indeed, the algorithm employed by the CLR garbage collector means that it may be a long time after the application has finished with the object. This lack of certainty is often termed 'non-deterministic finalization', and it means that C# destructors are not suitable for releasing scarce resources such as database connections, file handles etc.

    To achieve deterministic destruction, a class must offer a method to be used for the purpose. The standard approach is for the class to implement the IDisposable interface. The user of the object must call the Dispose() method when it has finished with the object. C# offers the 'using' construct to make this easier.

    Note that it's rarely necessary to define a destructor for a C# class - it only makes sense where the class holds direct references to unmanaged resources, which is very unusual. Implementing IDisposable is somewhat more commonly required, but still only necessary for a small minority of classes.

    6. What types of object can I throw as exceptions?

    Only instances of the System.Exception classes, or classes derived from System.Exception. This is in sharp contrast with C++ where instances of almost any type can be thrown.

    7. How can I process command-line arguments?

    Like this:

     using System;

    class CApp
    {
    public static void Main( string[] args )
    {
    Console.WriteLine( "You passed the following arguments:" );
    foreach( string arg in args )
    Console.WriteLine( arg );
    }
    }

    (Take a look at Charles Cook's NOptFunc project for easy command-line parsing.)

  • 相关阅读:
    转战物联网·基础篇06-深入理解MQTT协议之基本术语
    转战物联网·基础篇05-通俗理解MQTT协议的实现原理和异步方式
    转战物联网&#183;基础篇04-不可不知的进制关系与数据传输的本质
    转战物联网·基础篇03-从JSON数据到短指令谈思维的转变
    转战物联网·基础篇02-物联网中的角儿
    转战物联网·基础篇01-物联网之我见
    nRF24L01+组网方式及防撞(防冲突)机制的实战分享
    ElementUi中el-table分页效果
    原生无缝Banner轮播图
    详解立即执行函数(function(){}()),(function(){})()
  • 原文地址:https://www.cnblogs.com/taoxu0903/p/1739942.html
Copyright © 2011-2022 走看看