1.索引器

索引器允许类或结构的实例按照与数组相同的方式进行索引。索引器类似于属性,不同之处在于它们的访问器采用参数。它可以像数组那样对对象使用下标。它提供了通过索引方式方便地访问类的数据信息的方法。

要声明类或结构的索引器,使用this关键字。

  1. class SampleCollection<T>
  2. {
  3. private T[] arr = new T[];
  4. public T this[int i]
  5. {
  6. get {
  7. return arr[i];
  8. }
  9. set {
  10. arr[i] = value;
  11. }
  12. }
  13. }
  14. class Program
  15. {
  16. static void Main(string[] args)
  17. {
  18. //SampleCollection<int> i=new SampleCollection<int>();
  19. //i[0] = 1;
  20. // Console.WriteLine(i[0]);
  21. SampleCollection<string> s = new SampleCollection<string>();
  22. s[] = "HELLO";
  23. Console.WriteLine(s[]);
  24. Console.ReadKey();
  25. }
  26. }

2.静态构造函数的使用方法

这道题比较有意思,先看下代码及运行的结果:

  1. class Class1
  2. {
  3. public static int Count = ;
  4. static Class1()
  5. {
  6. Count++;
  7. }
  8. public Class1()
  9. {
  10. Count++;
  11. }
  12. }
  13. class Program
  14. {
  15. static void Main(string[] args)
  16. {
  17.  
  18. Class1 o1 = new Class1();
  19. Class1 o2 = new Class1();
  20. Console.WriteLine(Class1.Count);
  21. Console.ReadKey();
  22. }
  23. }

从调试的结果来看,运行到这行代码Class1 o1 = new Class1();调用static Class1() { Count++; }函数,然后会接着调用public Class1() { Count++; },再运行到Class1 o2 = new Class1();这行代码时,就只调用public Class1() { Count++; },(刚开始会认为只执行其中的一个函数,没想到结果会是这样,他们不是重载的关系吗?)

解释:

使用静态函数(静态方法),编译器会在编译程序代码的时候,将静态方法当作全局函数对待。
可以说静态函数(方法)是属于类的;
普通函数(方法)是属于对象的。

3.又一有意思的题目(这样的题目可以看出水平呀。。。)

直接上代码和运行结果了

  1. public class A
  2. {
  3. public virtual void Fun1(int i)
  4. {
  5. Console.WriteLine(i);
  6. }
  7. public void Fun2(A a)
  8. {
  9. a.Fun1();
  10. Fun1();
  11. }
  12. }
  13. public class B : A
  14. {
  15. public override void Fun1(int i)
  16. {
  17. base.Fun1(i+);
  18. }
  19. }
  20. class Program
  21. {
  22. static void Main(string[] args)
  23. {
  24.  
  25. B b = new B();
  26. A a = new A();
  27. a.Fun2(b);
  28. b.Fun2(a);
  29. Console.ReadKey();
  30. }
  31. }

分析:a.Fun2(b)是指先执行A类下的Fun2函数。Fun2函数下第一步是a.Fun1(1),但实际的实参是b,也就是b.Fun(1),由于重写(Override),其内容是base.Fun1(i+1),也就是执行Fun1(1+1)结果是2.

b.Fun2(a)是指先执行B类下的Fun2函数,可是B类本身没有Fun2函数,只有执行它的基类的Fun2函数。但实参是a,也就是执行a.Fun1(1),结果是1,下一行代码是Fun1(5) 实际上执行的是b.Fun1(5),实际执行结果是base.Fun1(5+1).

这个题的关键要搞清楚:一个函数的执行必须在一个具体的对象中实现。如果函数明确告诉是那个对象,则在该对象下执行;如果没有,则在默认的对象下执行。

4.C#委托和观察者模式(早就感觉这两之间有点关系,嘿,真的来了)

程序设计:猫大叫一声,所有的老鼠都开始逃跑,主人被惊醒。要求:一要有联动性,老鼠和主人的行为是被动的。二考虑可扩展性,猫的叫声可能引起其他联动效应

观察者模式:

  1. public interface Subject
  2. {
  3. void Register(Observer ob);
  4. }
  5. public interface Observer
  6. {
  7. void Response();
  8. }
  9. public class Mouse : Observer
  10. {
  11. private string name;
  12. public Mouse(string name, Subject sub)
  13. {
  14. this.name = name;
  15. sub.Register(this);//观察者注册
  16. }
  17. public void Response()
  18. {
  19. Console.WriteLine(name+" attempt to escape");
  20. }
  21. }
  22. public class Master : Observer
  23. {
  24. private string name;
  25. public Master(Subject sub)
  26. {
  27. sub.Register(this);//观察者注册
  28. }
  29. public void Response()
  30. {
  31. Console.WriteLine("the host waken!");
  32. }
  33. }
  34. public class Cat : Subject
  35. {
  36. private ArrayList observers;//用以数组保存所有观察者
  37. public void Register(Observer ob)
  38. {
  39. this.observers.Add(ob);
  40. }
  41. public Cat()
  42. {
  43. observers = new ArrayList();//构造函数初始化
  44. }
  45. public void Cry()//触发事件发生,并通知所有观察者
  46. {
  47. Console.WriteLine("cat cryed");
  48. foreach (Observer obs in this.observers)
  49. {
  50. obs.Response();//所有观察者给出相应的回应
  51. }
  52. }
  53. }
  54.  
  55. class Program
  56. {
  57. static void Main(string[] args)
  58. {
  59. Cat cat = new Cat();
  60. Mouse mouse1 = new Mouse("mouse1",cat);
  61. Mouse mouse2 = new Mouse("mouse2", cat);
  62. Master master = new Master(cat);
  63. cat.Cry();
  64. Console.ReadKey();
  65. }
  66. }

委托:

  1. public delegate void SubEventHandler();
  2. public abstract class Subject
  3. {
  4. public event SubEventHandler subEvent;
  5. protected void FireAway()
  6. {
  7. if (this.subEvent != null)
  8. this.subEvent();//熟悉却又陌生
  9. }
  10. }
  11. public class Cat : Subject
  12. {
  13. public void Cry()
  14. {
  15. Console.WriteLine("cat cryed!");
  16. this.FireAway();//触发绑定的事件
  17. }
  18. }
  19. public abstract class Observer
  20. {
  21. public Observer(Subject sub)
  22. {
  23. sub.subEvent += new SubEventHandler(Response);
  24. }
  25. public abstract void Response();
  26. }
  27. public class Mouse : Observer
  28. {
  29. private string name;
  30. public Mouse(string name, Subject sub):base(sub)//初始化列表
  31. {
  32. this.name = name;
  33. }
  34. public override void Response()
  35. {
  36. Console.WriteLine(name + "attempt to escape!");
  37. //throw new NotImplementedException();
  38. }
  39. }
  40. public class Master : Observer
  41. {
  42. public Master(Subject sub) : base(sub) { }
  43. public override void Response()
  44. {
  45. Console.WriteLine("host woken!");
  46. //throw new NotImplementedException();
  47. }
  48. }
  49. class Program
  50. {
  51. static void Main(string[] args)
  52. {
  53. Cat cat = new Cat();
  54. Mouse mouse1 = new Mouse("mouse1",cat);
  55. Mouse mouse2 = new Mouse("mouse2", cat);
  56. Master master = new Master(cat);
  57. cat.Cry();
  58. Console.ReadKey();
  59. }
  60. }

5.值类型和引用类型比较

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Collections;
  6.  
  7. namespace JiDan
  8. {
  9. public class RefPoint {
  10. public int x;
  11. public RefPoint(int x)
  12. {
  13. this.x = x;
  14. }
  15. }
  16. class Program
  17. {
  18. static void Main(string[] args)
  19. {
  20. bool result;
  21. RefPoint rPoint1 = new RefPoint();
  22. RefPoint rPoint2 = new RefPoint();
  23.  
  24. result = (rPoint1 == rPoint2);
  25. Console.WriteLine(result); // 返回 false;
  26.  
  27. result = rPoint1.Equals(rPoint2);//对于引用类型,即使类型的实例(对象)包含的值相等,如果变量指向的是不同的对象,那么也不相等。这个很关键
  28. Console.WriteLine(result); // #2 返回false
  29. result = (rPoint1.x).Equals(rPoint2.x);//这样就会相等了
  30. Console.WriteLine(result); //true
  31. object m1 = ;
  32. object m2 = ;
  33. result = m1.Equals(m2);//true,更清晰地理解是"=="用于比较引用是否相等,也就是是否指向同一个对象,如果指向的是同一个对象,那么Equal肯定相等
  34. //Equal用于值类型是否相等,也就是堆栈上的值。。只是初步的,更深地要对Equal原型方法熟悉。。
  35. Console.WriteLine(result);
  36. Console.ReadKey();
  37. }
  38. }
  39. }
6.ref和out的区别:
  1. 最近在许多论坛上看到关于了refout的区别,发现解释的都不非常理想。
    我想抄写点官方的解释,然后再来我自己的解释
  2.  
  3. //如下
  4.  
  5. 方法参数上的 out 方法参数关键字使方法引用传递到方法的同一个变量。当控制传递回调用方法时,在方法中对参数所做的任何更改都将反映在该变量中。
    当希望方法返回多个值时,声明 out 方法非常有用。使用 out 参数的方法仍然可以返回一个值。一个方法可以有一个以上的 out 参数。
    若要使用 out 参数,必须将参数作为 out 参数显式传递到方法。out 参数的值不会传递到 out 参数。
    不必初始化作为 out 参数传递的变量。然而,必须在方法返回之前为 out 参数赋值。
    属性不是变量,不能作为 out 参数传递
  6.  
  7. 方法参数上的 ref 方法参数关键字使方法引用传递到方法的同一个变量。当控制传递回调用方法时,在方法中对参数所做的任何更改都将反映在该变量中。
    若要使用 ref 参数,必须将参数作为 ref 参数显式传递到方法。ref 参数的值被传递到 ref 参数。
    传递到 ref 参数的参数必须最先初始化。将此方法与 out 参数相比,后者的参数在传递到 out 参数之前不必显式初始化。
    属性不是变量,不能作为 ref 参数传递
  8.  
  9. //上面的理解起来非常不好理解。下面我说说我自己的看法。
  10.  
  11. 首先:两者都是按地址传递的,使用后都将改变原来的数值。很多人在论坛上解释说out是按数值传递,是错误的。简单的测试后可以知道out使用也能改变数值的,所以肯定是按照地址传递的。
    其次:rel可以把参数的数值传递进函数,但是out是要把参数清空,就是说你无法把一个数值从out传递进去的,out进去后,参数的数值为空,所以你必须初始化一次。这个就是两个的区别,或者说就像有的网友说的,rel是有进有出,out是只出不进。经典!!!

C#相关的更多相关文章

  1. 嵌入式单片机STM32应用技术(课本)

    目录SAIU R20 1 6 第1页第1 章. 初识STM32..................................................................... ...

  2. java中的字符串相关知识整理

    字符串为什么这么重要 写了多年java的开发应该对String不陌生,但是我却越发觉得它陌生.每学一门编程语言就会与字符串这个关键词打不少交道.看来它真的很重要. 字符串就是一系列的字符组合的串,如果 ...

  3. SQL Server相关书籍

    SQL Server相关书籍 (排名不分先后) Microsoft SQL Server 企业级平台管理实践 SQL Server 2008数据库技术内幕 SQL Server性能调优实战 SQL S ...

  4. dotNET跨平台相关文档整理

    一直在从事C#开发的相关技术工作,从C# 1.0一路用到现在的C# 6.0, 通常情况下被局限于Windows平台,Mono项目把我们C#程序带到了Windows之外的平台,在工作之余花了很多时间在M ...

  5. 在ASP.NET Core应用中如何设置和获取与执行环境相关的信息?

    HostingEnvironment是承载应用当前执行环境的描述,它是对所有实现了IHostingEnvironment接口的所有类型以及对应对象的统称.如下面的代码片段所示,一个HostingEnv ...

  6. virtualbox linux虚拟机相关

    linux虚拟机设置为静态IP 在virtualbox中安装好linux虚拟机后,如果采用的是NAT方式的话,linux虚拟机默认采用dhcp方式自动上网,而且用的是NetworkManager服务而 ...

  7. WebGIS中等值面展示的相关方案简析

    文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/ 1.背景 等值面是气象.环保等相关项目上常用到的效果展示.在传统的CS项 ...

  8. .NET同步与异步之相关背景知识(六)

    在之前的五篇随笔中,已经介绍了.NET 类库中实现并行的常见方式及其基本用法,当然.这些基本用法远远不能覆盖所有,也只能作为一个引子出现在这里.以下是前五篇随笔的目录: .NET 同步与异步之封装成T ...

  9. zookeeper集群的搭建以及hadoop ha的相关配置

    1.环境 centos7 hadoop2.6.5 zookeeper3.4.9 jdk1.8 master作为active主机,data1作为standby备用机,三台机器均作为数据节点,yarn资源 ...

  10. mysql 5.7中的用户权限分配相关解读!

    这篇文章主要介绍了MySQL中基本的用户和权限管理方法,包括各个权限所能操作的事务以及操作权限的一些常用命令语句,是MySQL入门学习中的基础知识,需要的朋友可以参考下 一.简介 各大帖子及文章都会讲 ...

随机推荐

  1. Cobbler学习之一--Fedora17下配置Cobbler安装环境

    1:Cobbler是什么 Cobbler是一大Linux装机利器,可以快速的建立网络安装环境. 2:安装Cobbler需要的组件 createrepo httpd (apache2 for Debia ...

  2. LR loadrunner参数化-笔记

      LR在录制程序运行的过程中,VuGen(脚本生成器) 自动生成了包含录制过程中实际用到的数值的脚本,如果你企图在录制的脚本中使用不同的数值执行脚本的活动(如查询.提交等等),那么你必须用参数值取代 ...

  3. 8.4.3 Glide

    1). 导入库 dependencies { compile 'com.github.bumptech.glide:glide:3.5.2' compile 'com.android.support: ...

  4. 在Windows用Rebar来构建,编译,测试,发布Erlang项目

    rebar是一个遵循 Erlang/OTP 原则的 Erlang 项目构建工具,使用它可以减少构建标准 Erlang/OTP 项目架构配置的工作量,并且可以很容易的编译.测试.发布 Erlang 应用 ...

  5. [转]Oracle VM VirtualBox虚拟机,Ubuntu虚拟机共享文件夹

    VirtualBox的菜单里选择"设备" -> "安装增强功能...". "设备" -> "共享文档夹",添 ...

  6. 《利用Python进行数据分析》第6章学习笔记

    数据加载.存储与文件格式 读写文本格式的数据 逐块读取文本文件 read_xsv参数nrows=x 要逐块读取文件,需要设置chunksize(行数),返回一个TextParser对象. 还有一个ge ...

  7. java日志框架slf4j与log4j

    日志记录自然是非常重要的,但恐怕能记住slf4j与log4j等日志框架配置的人就很少了,这个东西不难,只是配置好后很少会去动它,开发新项目一般也是从其他项目拷贝,或者参照文档 废话不多说,先说log4 ...

  8. Quartz.net 定时调度时间配置格式说明与实例

    格式: [秒] [分] [小时] [日] [月] [周] [年] 序号 说明 是否必填 允许填写的值 允许的通配符 1 秒 是 0-59 , - * / 2 分 是 0-59 , - * / 3 小时 ...

  9. debian(kali Linux) 安装net Core

    debian(kali Linux) 安装net Core curl -sSL https://raw.githubusercontent.com/dotnet/cli/rel/1.0.0-previ ...

  10. Programming Entity Framework CodeFirst--表关系约定

    表之间的关系分为一对多,多对多,一对一三种,实质就是对外键进行配置. 一.一对多 1. Required Destination包含Lodging>的集合. public class Desti ...