`
coolsooner
  • 浏览: 1373381 次
文章分类
社区版块
存档分类
最新评论

C#方法

 
阅读更多

C#方法

1:实例构造器和类

2:实例构造器和结构

3:类型构造器

4:操作符重载方法

5:转换操作符方法

6:扩展方法

7:部分方法

1:实例构造器和类

构造器是允许将类型的实例初始化为良好状态的一种特殊方法,创建一个引用类型的实例时,先为实例的数据字段分配内存,然后初始化对象的附加字段(类型对象指针和同步索引),最后调用构造函数来设置对象的初始状态。构造函数不能被继承,所以不能被virtual、new、override、sealed和abstract修饰,若没有显示定义任何构造函数,编译器将定义一个无参的public构造函数,但若是抽象类,编译器将定义一个无参的protected的构造函数

创建一个类的实例并不一定非要调用构造函数。

1:使用Object的MemberwiseClone()方法。他的作用就是创建当前 System.Object 的浅表副本,内部工作机制是分配内存,初始化对象的附加字段(类型对象指针和同步索引),然后将源对象的字节数据复制到新对象中。从下面的代码可以看出MemberwiseClone()实现了对象复制,而不是简单的对象引用。


2:反序列化。在网络编程的时候,经常将一个对象序列化成二进制,然后传输出去,接收端反序列化成原来的对象,反序列化使用的是类

System.Runtime.Serialization.FormatterServices的方法public static objectGetUninitializedObject(Type type)或

public static objectGetSafeUninitializedObject(Type type)分配内存,而在这两个方法内部没有调用要被反序列化对象的构造函数。

字段的初始化代码会被编译器自动添加到相应的构造函数中,非静态字段的初始化代码会自动加到实例构造函数中,静态字段的初始化代码则添加到静态构造函数中,如果你的代码中有多个字段被初始化,还有多个构造函数的话,初始化代码在每个构造函数中都会有一份,这无疑会让你的生成文件(如DLL,EXE文件)变大。

证明这一点的代码如下:


经过IL反编译,方法SomeType(int x, int y)代码如下


先执行了初始化代码,其他构造函数都包含了初始化代码,然后在执行构造函数中的赋值代码,要解决这个代码膨胀问题,方法很简单,把初始化代码写在无参构造函数中,让其他构造函数调用。

2:实例构造器和结构

值类型的工作方式与引用类型截然不同,值类型其实并不需要定义构造函数,地球人根本阻止不了值类型实例化,编译器根本不会生产默认无参构造函数,如果你显示声明无参构造函数,编译根本通过不了,报错“结构不能包含显式的无参数构造函数”。由于值类型存在栈中,根本不需要对堆中的数据进行引用,所以我们可以在定义的时候就直接赋值,(int i=0;string s=”a”;Pointp;p.X=2;)他根本不需要new,new当然是可以的,调用构造函数会初始化所有的字段成相应类型的默认值,实例如下:


结构的特点:

1:不能显示定义无参构造函数

2:不能在定义字段的时候初始化

3:声明有参构造函数的时候,要初始化所有的字段

3:类型构造器

实例构造器就是静态构造函数,他的作用是设置类型的初始化状态,静态构造函数只能有一个,且是无参的,不能有访问修饰符修饰,默认就是private,由编译器调用执行。实例如下:


在定义静态字段并初始化,编译器会自动生成一个类型构造器(静态构造函数),并将静态字段的初始化代码插在类型构造器的前面,从上面的代码可以看出,定义时初始化和在类型构造器中初始化只需要一个即可,还有112的16进制为0x70,所以在代码中看到16进制也不用大惊小怪,根本不涉及性能问题,若定义了静态字段,但没有初始化任何一个,编译器是不会生成类型构造器的。但是静态字段还是会被初始化,其实不管是静态的还是非静态的字段都是会被编译器自动初始化的,int类型的初始化为0;bool:False;string:null,这就是为什么你在实例化实体的时候,有些字段你没有初始化,却不会报错,而且你知道没有初始化的字符串的值就是null,也就是说编译器会帮你初始化你没有初始化的字段,然而在方法中定义的局部变量是需要自己初始化的,如果你没有初始化,会报一个错误“使用了未赋值的局部变量X”。

4:操作符重载方法

要想实现操作符重载,只需要保证以下两点,其他的话都是浮云:

1:操作符重载方法必须是public和static方法

2:操作符重载方法至少有一个参数的类型与当前定义这个方法的类型相同。之所以是要这个条件是为了使编译器在合理的时间内找到要绑定的操作方法,实例如下


5:转换操作符方法

要实现转换操作符方法,条件和操作符重载方法的条件是一样的,实例如下:


隐式和显示类型转换的实现原理就这么简单,在C++中隐式类型转换根本不需要你写代码,只要有相应的public构造函数就可以了,如int转换成Rational,只需要有构造函数public Rational(int data)就可以了,如Rational r=1;编译器会尽一切努力寻找将int类型转换成Rational的方法,当它发现这个构造函数,他说都不说就帮你进行转换了,就因为这样有时候非常坑爹,你一个int类型无缘无故的就变成Rational了,而你却根本不知道怎么回事,有时候为了解决这个问题,还得自己定义一个类(Uint)来封装int,然后构造函数改成Rational(Uintdata),C#就没有这个问题,当然你要想实现隐式类型转换就自己写代码吧。

6:扩展方法

实现扩展方法的条件:

1:定义扩展方法的类必须是非泛型静态类

2:这个类必须有自己的作用域,即不能是内部类

3:方法必须是public和static

4:方法的第一个参数必须用this修饰,第一个参数就是你要扩展的类型,实例如下:


7:部分方法

你懂的

分享到:
评论

相关推荐

    js调用C#方法

    ### JS调用C#方法及C#调用JS方法详解 在Web开发中,前后端交互是必不可少的一个环节。本文将详细介绍如何实现前端JavaScript(JS)与后端C#之间的相互调用,这对于构建功能丰富的Web应用至关重要。下面将按照问题的...

    cefsharp JavaScript调用C#方法并返回参数

    2. 调用C#方法:在JavaScript中,可以使用`window.chrome.webview`对象的`call`方法来调用C#方法。假设我们有一个名为`addNumbers`的C#方法,接受两个整数参数并返回它们的和,JavaScript代码可能如下: ```...

    c#方法大全

    c#方法大全

    c# winform webbrowser页面中js调用winform类方法

    如果C#方法需要执行耗时操作,应考虑异步处理,以避免阻塞UI线程。你可以使用`async/await`关键字来实现异步操作。 通过以上步骤,你就能实现JavaScript在WinForm的`WebBrowser`控件中调用C#类方法的功能。这个...

    javascript技巧(javascript调用C#方法)个人学习笔记

    javascript技巧(javascript调用C#方法) 个人笔记

    .NET前台按钮实时调用C#后台方法(函数)

    两种方式总有一种方式适合你(附有demo)。 方式1:.NET前台JS调用后台C#方法(函数) 方式2:.NET前台按钮实时调用C#后台方法(函数) http://user.qzone.qq.com/669247240/blog/1302317905

    JS调用C#后台方法

    标题"JS调用C#后台方法"描述了这种跨语言通信的需求。本文将深入探讨如何使用JavaScript调用C#编写的后台方法,并介绍相关技术与实践。 首先,JavaScript作为客户端脚本语言,运行在用户的浏览器上,而C#通常是...

    C#动态调用类方法

    1.动态调用类方法,模拟VB中的CallByName 2.附带了C#和VB的代码 3.主要是一个项目中用到了要调用很多参数和返回值相同的一系列函数,所以 想到了这个方法,不用重复的写方法名,使用循环调用

    Creo二次开发调用C#方法

    Creo二次开发一般使用C++开发,Creo中嵌入C#只能通过COM接口方式,该文档总结了大致的过程

    java调用c#样例

    3. **调用方法**:通过`invokeMethod`或`getDispatch`等方法调用C# DLL中的方法或属性。 4. **处理结果**:获取方法调用的结果,并在Java应用中使用。 5. **错误处理**:处理可能出现的异常,确保代码的健壮性。 ...

    Java 代码转换为 C# Java to C# Converter

    Java 代码转换为 C# Java to C# Converter 解除限制 Java 代码转换为 C# Java to C# Converter 解除限制 Java 代码转换为 C# Java to C# Converter 解除限制

    VB6.0调用C# Dll解决方法

    - 确保C#方法的参数和返回值类型与VB6兼容。例如,字符串在VB6中是Variant类型,而在.NET中是String类型,可能需要额外处理。 - 避免使用VB6不支持的数据类型,如DateTime,可能需要转换为VB6可识别的日期/时间...

    C++调用C#的DLL程序实现方法

    把C#编译成DLL或者Axtive控件,再由C调用!比如使用C++调用C#的DLL。 SwfDotNet是.net下输出flash的类库。SwfDotNet是C#编写的,作者的C#水平,真是令我佩服。这是个特别好的读写Swf文件的库。但是,我要用在C++项目...

    C#与Lua交互的例程

    此例程中的LuaCSharpTest可能包含了一个示例项目,展示了C#如何启动Lua环境,注册C#方法,以及Lua如何调用这些方法。通过运行和分析这个测试项目,开发者可以更深入地理解C#和Lua之间的交互流程,为实际项目提供参考...

    c# 代码中看不到方法体.docx

    看了网上好多同仁的疑惑,说为什么看不到方法体,例如:public int sum(int x,int y); 这个方法既不在接口中,也不在抽象类中。好像不符合C#的语法。 现将详细解释附上,希望能够大小同仁的疑惑。

    C++调用C#的DLL实例程序

    然而,对于C# DLL,我们通常使用`[System::Runtime::InteropServices::DllImport]`,并指定`CharSet = CharSet::Auto`,因为C#方法默认使用托管字符串。 3. 在C++/CLI中引用C# DLL:在C++/CLI项目中,添加对C# DLL...

    C#通过geckofx-v45.0.控件完美实现C#与JS之间互相调用,工程亲测100%可用良心工程决不骗积分。

    为了使JavaScript能够调用C#方法,我们需要注册这些方法。`Geckofx`提供了一个名为`AddGlobalObject`的方法,它可以将C#对象暴露给JavaScript。这个对象的所有公共成员(方法和属性)都将成为JavaScript中的全局对象...

    C#窗体与GeckoFx浏览器之间的相互调用

    然后在项目中引用这个库,使C#代码能够访问其提供的类和方法。 2. **创建GeckoWebBrowser控件** 在C#窗体设计器中,可以通过工具箱找到GeckoWebBrowser控件,将其拖放到窗体上。或者在代码中动态创建,如: ```...

    unity3d中js调用C#类,混合调用

    要使C#的方法可从JavaScript调用,这些方法必须是公共的,并且不带任何内部实现细节。这可以通过定义接口来实现,这样JavaScript可以只看到接口,而不知道具体的实现细节。 4. **C#到JavaScript的调用**: C#可以...

    WinForm下WebView2实现JS与C#交互Demo

    通过`AddScriptToExecuteOnDocumentCreated`方法,可以在网页加载时执行一段JavaScript代码,这段代码可以注册一个全局函数,用于调用C#方法: ```csharp private void RegisterJsCallCSharp() { webView2....

Global site tag (gtag.js) - Google Analytics