C#相关
1.索引器
索引器允许类或结构的实例按照与数组相同的方式进行索引。索引器类似于属性,不同之处在于它们的访问器采用参数。它可以像数组那样对对象使用下标。它提供了通过索引方式方便地访问类的数据信息的方法。
要声明类或结构的索引器,使用this关键字。
class SampleCollection<T>
{
private T[] arr = new T[];
public T this[int i]
{
get {
return arr[i];
}
set {
arr[i] = value;
}
}
}
class Program
{
static void Main(string[] args)
{
//SampleCollection<int> i=new SampleCollection<int>();
//i[0] = 1;
// Console.WriteLine(i[0]);
SampleCollection<string> s = new SampleCollection<string>();
s[] = "HELLO";
Console.WriteLine(s[]);
Console.ReadKey();
}
}
2.静态构造函数的使用方法
这道题比较有意思,先看下代码及运行的结果:
class Class1
{
public static int Count = ;
static Class1()
{
Count++;
}
public Class1()
{
Count++;
}
}
class Program
{
static void Main(string[] args)
{ Class1 o1 = new Class1();
Class1 o2 = new Class1();
Console.WriteLine(Class1.Count);
Console.ReadKey();
}
}

从调试的结果来看,运行到这行代码Class1 o1 = new Class1();调用static Class1() { Count++; }函数,然后会接着调用public Class1() { Count++; },再运行到Class1 o2 = new Class1();这行代码时,就只调用public Class1() { Count++; },(刚开始会认为只执行其中的一个函数,没想到结果会是这样,他们不是重载的关系吗?)
解释:
使用静态函数(静态方法),编译器会在编译程序代码的时候,将静态方法当作全局函数对待。
可以说静态函数(方法)是属于类的;
普通函数(方法)是属于对象的。
3.又一有意思的题目(这样的题目可以看出水平呀。。。)
直接上代码和运行结果了
public class A
{
public virtual void Fun1(int i)
{
Console.WriteLine(i);
}
public void Fun2(A a)
{
a.Fun1();
Fun1();
}
}
public class B : A
{
public override void Fun1(int i)
{
base.Fun1(i+);
}
}
class Program
{
static void Main(string[] args)
{ B b = new B();
A a = new A();
a.Fun2(b);
b.Fun2(a);
Console.ReadKey();
}
}

分析: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#委托和观察者模式(早就感觉这两之间有点关系,嘿,真的来了)
程序设计:猫大叫一声,所有的老鼠都开始逃跑,主人被惊醒。要求:一要有联动性,老鼠和主人的行为是被动的。二考虑可扩展性,猫的叫声可能引起其他联动效应
观察者模式:
public interface Subject
{
void Register(Observer ob);
}
public interface Observer
{
void Response();
}
public class Mouse : Observer
{
private string name;
public Mouse(string name, Subject sub)
{
this.name = name;
sub.Register(this);//观察者注册
}
public void Response()
{
Console.WriteLine(name+" attempt to escape");
}
}
public class Master : Observer
{
private string name;
public Master(Subject sub)
{
sub.Register(this);//观察者注册
}
public void Response()
{
Console.WriteLine("the host waken!");
}
}
public class Cat : Subject
{
private ArrayList observers;//用以数组保存所有观察者
public void Register(Observer ob)
{
this.observers.Add(ob);
}
public Cat()
{
observers = new ArrayList();//构造函数初始化
}
public void Cry()//触发事件发生,并通知所有观察者
{
Console.WriteLine("cat cryed");
foreach (Observer obs in this.observers)
{
obs.Response();//所有观察者给出相应的回应
}
}
} class Program
{
static void Main(string[] args)
{
Cat cat = new Cat();
Mouse mouse1 = new Mouse("mouse1",cat);
Mouse mouse2 = new Mouse("mouse2", cat);
Master master = new Master(cat);
cat.Cry();
Console.ReadKey();
}
}
委托:
public delegate void SubEventHandler();
public abstract class Subject
{
public event SubEventHandler subEvent;
protected void FireAway()
{
if (this.subEvent != null)
this.subEvent();//熟悉却又陌生
}
}
public class Cat : Subject
{
public void Cry()
{
Console.WriteLine("cat cryed!");
this.FireAway();//触发绑定的事件
}
}
public abstract class Observer
{
public Observer(Subject sub)
{
sub.subEvent += new SubEventHandler(Response);
}
public abstract void Response();
}
public class Mouse : Observer
{
private string name;
public Mouse(string name, Subject sub):base(sub)//初始化列表
{
this.name = name;
}
public override void Response()
{
Console.WriteLine(name + "attempt to escape!");
//throw new NotImplementedException();
}
}
public class Master : Observer
{
public Master(Subject sub) : base(sub) { }
public override void Response()
{
Console.WriteLine("host woken!");
//throw new NotImplementedException();
}
}
class Program
{
static void Main(string[] args)
{
Cat cat = new Cat();
Mouse mouse1 = new Mouse("mouse1",cat);
Mouse mouse2 = new Mouse("mouse2", cat);
Master master = new Master(cat);
cat.Cry();
Console.ReadKey();
}
}
5.值类型和引用类型比较
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Collections; namespace JiDan
{
public class RefPoint {
public int x;
public RefPoint(int x)
{
this.x = x;
}
}
class Program
{
static void Main(string[] args)
{
bool result;
RefPoint rPoint1 = new RefPoint();
RefPoint rPoint2 = new RefPoint(); result = (rPoint1 == rPoint2);
Console.WriteLine(result); // 返回 false; result = rPoint1.Equals(rPoint2);//对于引用类型,即使类型的实例(对象)包含的值相等,如果变量指向的是不同的对象,那么也不相等。这个很关键
Console.WriteLine(result); // #2 返回false
result = (rPoint1.x).Equals(rPoint2.x);//这样就会相等了
Console.WriteLine(result); //true
object m1 = ;
object m2 = ;
result = m1.Equals(m2);//true,更清晰地理解是"=="用于比较引用是否相等,也就是是否指向同一个对象,如果指向的是同一个对象,那么Equal肯定相等
//Equal用于值类型是否相等,也就是堆栈上的值。。只是初步的,更深地要对Equal原型方法熟悉。。
Console.WriteLine(result);
Console.ReadKey();
}
}
}
最近在许多论坛上看到关于了ref和out的区别,发现解释的都不非常理想。
我想抄写点官方的解释,然后再来我自己的解释 //如下 方法参数上的 out 方法参数关键字使方法引用传递到方法的同一个变量。当控制传递回调用方法时,在方法中对参数所做的任何更改都将反映在该变量中。
当希望方法返回多个值时,声明 out 方法非常有用。使用 out 参数的方法仍然可以返回一个值。一个方法可以有一个以上的 out 参数。
若要使用 out 参数,必须将参数作为 out 参数显式传递到方法。out 参数的值不会传递到 out 参数。
不必初始化作为 out 参数传递的变量。然而,必须在方法返回之前为 out 参数赋值。
属性不是变量,不能作为 out 参数传递。 方法参数上的 ref 方法参数关键字使方法引用传递到方法的同一个变量。当控制传递回调用方法时,在方法中对参数所做的任何更改都将反映在该变量中。
若要使用 ref 参数,必须将参数作为 ref 参数显式传递到方法。ref 参数的值被传递到 ref 参数。
传递到 ref 参数的参数必须最先初始化。将此方法与 out 参数相比,后者的参数在传递到 out 参数之前不必显式初始化。
属性不是变量,不能作为 ref 参数传递。 //上面的理解起来非常不好理解。下面我说说我自己的看法。 首先:两者都是按地址传递的,使用后都将改变原来的数值。很多人在论坛上解释说out是按数值传递,是错误的。简单的测试后可以知道out使用也能改变数值的,所以肯定是按照地址传递的。
其次:rel可以把参数的数值传递进函数,但是out是要把参数清空,就是说你无法把一个数值从out传递进去的,out进去后,参数的数值为空,所以你必须初始化一次。这个就是两个的区别,或者说就像有的网友说的,rel是有进有出,out是只出不进。经典!!!
C#相关的更多相关文章
- 嵌入式单片机STM32应用技术(课本)
目录SAIU R20 1 6 第1页第1 章. 初识STM32..................................................................... ...
- java中的字符串相关知识整理
字符串为什么这么重要 写了多年java的开发应该对String不陌生,但是我却越发觉得它陌生.每学一门编程语言就会与字符串这个关键词打不少交道.看来它真的很重要. 字符串就是一系列的字符组合的串,如果 ...
- SQL Server相关书籍
SQL Server相关书籍 (排名不分先后) Microsoft SQL Server 企业级平台管理实践 SQL Server 2008数据库技术内幕 SQL Server性能调优实战 SQL S ...
- dotNET跨平台相关文档整理
一直在从事C#开发的相关技术工作,从C# 1.0一路用到现在的C# 6.0, 通常情况下被局限于Windows平台,Mono项目把我们C#程序带到了Windows之外的平台,在工作之余花了很多时间在M ...
- 在ASP.NET Core应用中如何设置和获取与执行环境相关的信息?
HostingEnvironment是承载应用当前执行环境的描述,它是对所有实现了IHostingEnvironment接口的所有类型以及对应对象的统称.如下面的代码片段所示,一个HostingEnv ...
- virtualbox linux虚拟机相关
linux虚拟机设置为静态IP 在virtualbox中安装好linux虚拟机后,如果采用的是NAT方式的话,linux虚拟机默认采用dhcp方式自动上网,而且用的是NetworkManager服务而 ...
- WebGIS中等值面展示的相关方案简析
文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/ 1.背景 等值面是气象.环保等相关项目上常用到的效果展示.在传统的CS项 ...
- .NET同步与异步之相关背景知识(六)
在之前的五篇随笔中,已经介绍了.NET 类库中实现并行的常见方式及其基本用法,当然.这些基本用法远远不能覆盖所有,也只能作为一个引子出现在这里.以下是前五篇随笔的目录: .NET 同步与异步之封装成T ...
- zookeeper集群的搭建以及hadoop ha的相关配置
1.环境 centos7 hadoop2.6.5 zookeeper3.4.9 jdk1.8 master作为active主机,data1作为standby备用机,三台机器均作为数据节点,yarn资源 ...
- mysql 5.7中的用户权限分配相关解读!
这篇文章主要介绍了MySQL中基本的用户和权限管理方法,包括各个权限所能操作的事务以及操作权限的一些常用命令语句,是MySQL入门学习中的基础知识,需要的朋友可以参考下 一.简介 各大帖子及文章都会讲 ...
随机推荐
- winAPI 中 的 GlobalLock GlobalUnlock 的作用
在项目中遇到GlobalLock GlobalUnlock 这两个操作内存的函数. 百度百科解释为:锁定内存中指定的内存块,并返回一个地址值,令其指向内存块的起始处.除非用 GlobalUnlock ...
- 播放一个视频并用滚动条控制进度-OpenCV应用学习笔记二
今天我们来做个有趣的程序实现:利用OpenCV读取本地文件夹的视频文件,并且在窗口中创建拖动控制条来显示并且控制视频文件的读取进度. 此程序调试花费了笔者近一天时间,其实大体程序都已经很快写出,结果执 ...
- 关于gridview里加按钮事件的总结
1. onrowcommand="GridView1_RowCommand1" 在gridview申明时的属性里要有,然后找到闪电,双击 还有要把那个按钮行模板化,就是箭头里面的t ...
- java中类型转换
1.基本数据类型转换 char, byte,short,int,long,float,double,boolean (1)小类型数据可以直接赋给大类型数据 例:char a=' ...
- 用Win7自带的磁盘管理工具给硬盘分区
最近新买了一台笔记本,要给硬盘分几个区,心想还是用个工具方便点,于是就上网准备下个“硬盘分区魔术师”,但是看到有一篇文章介绍Win7系统也自带了硬盘分区工具,这我以前倒没听说过,试了一下,还挺方便好用 ...
- easyui 折叠数据表格使用
因为要用到折叠数据表格 但是官网上的例子不能展示 费了好大劲 走了很多弯路 现在能显示出数据 以前大多都是看别人写的文章 自己解决问题的时候几乎没记录过 现在想想真不是好习惯 特此记录分享出来 有需要 ...
- CoinPunk项目介绍
CoinPunk是一个bitcoin比特币钱夹服务web应用程序,你可以自己构建钱夹服务.开源,免费. 轻量级,高效 响应式设计 轻易创建新账户 详细的交易记录 构建于Node.js与H ...
- 使用you-get下载视频网站视频或其他
使用you-get下载视频网站视频或其他 文/玄魂 目录 使用you-get下载视频网站视频或其他 前言 1.1 下载.安装 依赖 exe安装 pip安装 Antigen安装 Git 克隆源码 Hom ...
- 一步一步跟我学DeviceOne开发 - 仿微信应用(一,二,三)
这是一个系列的文档,长期目标是利用DeviceOne开发一些目前使用广泛的优质手机应用,我们会最大化的实现这些应用的每一个功能和细节,不只停留在简单的UI模仿和Demo阶段,而是一个基本可以使用的实际 ...
- Oracle存在修改,不存在插入记录
接触编程以来,在数据存储方面一直用的MS SQL.Oracle这名字对我来说是如此的熟悉,但是对其内容却很陌生,最近公司的一个项目用起了Oracle,所以也开始高调的用起了Oracle.在没有接触Or ...