当前位置:  编程技术>.net/c#/asp.net
本页文章导读:
    ▪[转载]C#中的new修饰符以及多态      new关键字可以作为运算符,创建一个对象,也可以做修饰符;作修饰符的时候,官方文档的解释为:Used to hide an inherited member from a base class member.中文意思为隐藏从基类中继承了的成员。那么.........
    ▪12篇学通C#网络编程——第四篇 TCP应用编程          年底了,人浮躁多了,沉不下去心研究技术了,不过昨天终于抢到了回家的票,很开心。    言归正卷,在WCF出来之后,可能我们玩这些原始的TCP越来越少了,我们知.........
    ▪WPF 选择文件,文件夹生成路径      查找文件路径              private void stackPanel1_Click(object sender, EventArgs e)              {   .........

[1][转载]C#中的new修饰符以及多态
    来源:    发布时间: 2013-10-28

new关键字可以作为运算符,创建一个对象,也可以做修饰符;

作修饰符的时候,官方文档的解释为:

Used to hide an inherited member from a base class member.

中文意思为隐藏从基类中继承了的成员。

那么如何理解“隐藏是”的意思?

本人以为,这里的隐藏是指隐藏了从基类中继承了的成员,可以理解为,虽然子类从基类中继承了该成员,但是该成员对子类不可见,或者说子类不认为该成员是从父类继承得来的,而认为是自己新建的一个成员,和父类的一点关系也没有。

假设有如下代码: 

1 class Program
2 2 {
3 3 static void Main(string[] args)
4 4 {
5 5 Son s = new Son();
6 6 s.methodB();
7 7 Console.ReadLine();
8 8 }
9 9 }
10 10
11 11 public class Father
12 12 {
13 13 public virtual void methodA()
14 14 {
15 15 Console.WriteLine("Father.methodA");
16 16 }
17 17
18 18 public virtual void methodB()
19 19 {
20 20 methodA();
21 21 }
22 22 }
23 23
24 24 public class Son : Father
25 25 {
26 26 public new void methodA()
27 27 {
28 28 Console.WriteLine("Son.methodA");
29 29 }
30 30 }

当运行 s.methodB();的时候,会去运行s中从Father继承了的methodA,但是程序发现Son类中并没有从Father中继承methodA方法(虽然Son类中有一个methodA方法,但是程序不认为该方法是从Father中继承的)。因此,在这种情况下,程序会根据继承链,寻找离Son类最近的基类,找到Father,然后再调用Father类中的methodA,因此程序输出的是Father.methodA。

如果将new改成override,则得到的就是Son.methodA。

因此可以得出一些总结,override和new都是根据对象的运行时类型调用该类型的方法。当方法是override修饰的,则调用该方法。但是当方法是new修饰的,则认为该方法并没有被继承,转而根据继承链去找离该对象最近的基类的方法。

继承虚函数时,无论使用new修饰还是override,都是一种多态的体现。多态的概念简单的说就是A物体表现出B物体的行为,性质。在计算机科学中,多态是编程语言的一种特性,它允许不同类型的数据可以通过一个统一的接口进行操作。多态通常分为编译时多态和运行时多态。运行时的多态性就是指直到系统运行时,才根据实际情况决定实现何种操作。

无论使用new还是override,都是在运行的时候才确定要调用哪个方法。再看下面的例子,可以更好的理解new和override和多态的关系:

1 class Program
2 {
3 static void Main(string[] args)
4 {
5 string input = Console.ReadLine();
6 Person p = null;
7 if (input == "0")
8 {
9 p = new GrandFather();
10 }
11 else if (input == "1")
12 {
13 p = new Father();
14 }
15 else if (input == "2")
16
    
[2]12篇学通C#网络编程——第四篇 TCP应用编程
    来源:    发布时间: 2013-10-28

    年底了,人浮躁多了,沉不下去心研究技术了,不过昨天终于抢到了回家的票,很开心。

    言归正卷,在WCF出来之后,可能我们玩这些原始的TCP越来越少了,我们知道WCF对TCP进行了再一次的包装,第一反应给我们的或许是

同构系统用TCP,异构系统用HTTP,那么问题来了,异构系统到底可不可以用TCP呢?至少WCF是玩不了的,因为其他语言没有针对.net的“服务

引用”,也没有什么ChannelFactory给你去玩,如果你是一定要追求性能的话,原始的TCP会助你一臂之力的。

   我们知道最最原始的是玩Socket,由于Socket比较复杂,但是最灵活,C#里面提供了两个简化的包装类:TcpListener和TcpClient。

一:TcpListener

   这个是作为服务器端程序而存在的,我们来看看如何使用这服务端。

1: 开启监听地址

1 TcpListener listener = new TcpListener(new System.Net.IPAddress(new byte[] { 127, 0, 0, 1 }), 2222);
2
3 listener.Start();

 

2:好了,已经开启了,服务端程序开始监听该端口的客户端请求了,那么如何获取该请求呢?简单,listener的AcceptTcpClient属性搞定。

1 var myclient = listener.AcceptTcpClient();


 3:我们知道TCP传的是字节流,通过myclient.GetStream()就可以获取一个NetworkStream,利用这个Stream就可以进行收发信息了。

 <1> 收操作:

1 BinaryReader sr = new BinaryReader(client.GetStream());
2
3 //客户端数据
4 var data = sr.ReadString();


<2>发操作:也就是所谓的返回值

1 //处理完了之后要返回数据给客户端
2 BinaryWriter sw = new BinaryWriter(client.GetStream());
3
4 sw.Write(string.Format("当前时间:{0},服务端已经处理完毕!", DateTime.Now));

 

  这里要注意的地方就是AcceptTcpClient是阻塞线程的,直到收到客户端请求才算建立了一个TCP连接,在服务端处理的过程中,后续的客户端的请求将

会处理等待直到前一个请求处理完,说了这么多,就是每一个请求我们都建议开一个线程专门为其服务,类似这样。

1 //接受客户端的连接请求
2 var myclient = listener.AcceptTcpClient();
3
4 //用工作线程执行用户的请求
5 Task.Factory.StartNew((obj) =>
6 {
7 var client = obj as TcpClient;
8
9 client.Close();
10
11 }, myclient);


好了,服务器端大概就是这个样子,再有的就是一些相关属性配置了,像wcf那样什么opentime,sendtime啥的。

 

二:TcpClient

     客户端也很简单,只要我们Connect一下端口,然后通过NetworkStream再Send一些数据就OK了。

1 TcpClient client = new TcpClient();
2
3 client.Connect(new System.Net.IPAddress(new byte[] { 127, 0, 0, 1 }), 2222);
4
5 BinaryWriter bw = new BinaryWriter(client.GetStream());
6
7 bw.Write(string.Format("你好,我来请求你! {0},当前线程:{1}", j, Thread.CurrentThread.ManagedThreadId));


三:模拟

     最后我们模拟下,客户端开启100个线程,每个线程请求100次,服务器端对每个线程都用工作线程去处理,是不是找到了netTcpBinding的

感觉,最后一个大家都懂的道理就是线程多了不是好事情。

服务端:

1 using System;
2 using System.Collections.Generic;
3 using System.Linq;
4 using System.Text;
5 using System.Net.Sockets;
6 using System.IO;
7 using System.Threading.Tasks;
8 using System.Threading;
9 using System.Net;
10
11 namespace ConsoleApplication1
12 {
13 class Program
14 {
15 static void Main(string[] args)
16 {
17 TcpListener listener = new TcpListener(new System.Net.IPAddress(new byte[] { 127, 0, 0, 1 }),
    
[3]WPF 选择文件,文件夹生成路径
    来源:    发布时间: 2013-10-28

查找文件路径
              private void stackPanel1_Click(object sender, EventArgs e)
              {
                  //查找文件路径
                OpenFileDialog d = new OpenFileDialog();
                if (d.ShowDialog() == true) // Result could be true, false, or null
                folderName = d.FileName;
                textBox1.Text = folderName;
              
              }

查找文件夹路径
必须手动加载  System.Windows.Forms.dll
浏览添加:
 C:\Program Files\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0\Profile\Client\System.Windows.Forms.dll

FolderBrowserDialog folderBrowser = new FolderBrowserDialog();
            if (folderBrowser.ShowDialog() == DialogResult.OK)
            {
                DataStore.AddFolder(folderBrowser.SelectedPath);
            }

 

本文链接


    
最新技术文章:
 




特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

©2012-2021,,E-mail:www_#163.com(请将#改为@)

浙ICP备11055608号-3