C# 初学
突然对C#充满了兴趣,于是兴致勃勃的折腾起来。
下面是折腾的过程:
IDE,我选择了vs2017,不过这货的安装选项略多,对于新手来说各种坑。无论如何,选择”.NET桌面开发”即可,其他的全部留空。
然后新建项目,C#项目,控制台项目。
可以开搞了!
总的来说,C#和Java很像 -- 抽象、虚函数、继承、接口等,然而又具有C++的很多特性,如运算符重载!
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace ConsoleApp1
{
class Go
{
static void Main(string[] args)
{
Cat cat1 = new Cat("a_cat");
Cat cat2 = new Cat("b_cat");
Cat cat3 = new Cat("c_cat"); Console.WriteLine(Animal.Count);
Console.WriteLine(cat1); //测试委托
DoIt doIt = cat1.Speak;
doIt += cat2.Speak; //注意,只要方法签名一致即可连续添加
doIt += cat3.Speak;
doIt += () =>
{
Console.WriteLine("来自Lambda");
};//lambda
doIt(); //测试静态类方法扩展
Dog dog = new Dog("a_dog");
dog.Jump();//这个方法,类似于js的apply或者call //测试隐式转换
Cat cat = dog;
Console.WriteLine(cat);
//测试显式转换
dog = (Dog)cat;
Console.WriteLine(dog); //模拟事件
Client c1 = new Client();
Client c2 = new Client(); Animal.NewAnimal += c1.WantAnimal;
Animal.NewAnimal += c2.WantAnimal; Animal dogq = new Dog("Q-dog"); //测试集合
ArrayList al = new ArrayList();
al.Add(cat1);
al.Add(cat2);
al.Add(cat3);
al.Add(cat2);
Console.WriteLine("ArrayList's count is "+al.Count);
al.Remove(cat2); //只会删除第一个
Console.WriteLine("ArrayList's count is " + al.Count); List<Animal> list = new List<Animal>();
list.Add(cat1);
list.Add(cat2);
list.Add(cat3);
list.Add(cat2);
Console.WriteLine("List's count is " + list.Count); Stack<Animal> stack = new Stack<Animal>();
stack.Push(cat1);
stack.Push(cat2);
stack.Push(cat3);
Console.WriteLine("stack.Peek() = " + stack.Peek() + "; stack.Count = " + stack.Count);
Console.WriteLine("stack.Pop() = " + stack.Pop() + "; stack.Count = " + stack.Count); Queue<Animal> queue = new Queue<Animal>();
queue.Enqueue(cat1);
queue.Enqueue(cat2);
queue.Enqueue(cat3);
Console.WriteLine("queue.First() = " + queue.First() + "; queue.Count = " + queue.Count);
Console.WriteLine("queue.Last() = " + queue.Last() + "; queue.Count = " + queue.Count);
Console.WriteLine("queue.Dequeue() = " + queue.Dequeue() + "; queue.Count = " + queue.Count); Dictionary<int, Animal> dic = new Dictionary<int, Animal>();
dic.Add(, cat1);
dic.Add(, cat2);
dic.Add(, cat3);
Console.WriteLine("dic.Keys = " + dic.Keys + "; dic.Count = " + dic.Count);
Console.WriteLine("自定义扩展dic.Print() = " + dic.PrintKeys() + "; dic.Count = " + dic.Count);
Console.WriteLine("自定义扩展dic.PrintValues() = " + dic.PrintValues() + "; dic.Count = " + dic.Count);
Console.WriteLine(dic); Console.ReadLine();
}
} public delegate void DoIt();//委托,托管一堆方法?!位置,放这里也行? interface ISpeak
{
void Speak();
}
interface IEat
{
void Eat();
}
class Animal
{
protected string _name;
public static int Count;//用来计数,数一下有多少animal的实例
public delegate void Handler();//事件订阅
public static event Handler NewAnimal; //事件 public Animal() {
++Count;
//通知各位,有新动物来啦
NewAnimal?.Invoke();
}
public Animal(string Name):this()
{
_name = Name;
}
static Animal()
{
Count=;
}
public void setName(string Name)
{
_name = Name;
}
public string getName()
{
return _name ;
}
override public string ToString() //重写父类的
{
return "Animal[_name="+_name+", Count="+Count+"]";
}
}
//狗类,继承自动物,实现接口
class Dog : Animal, ISpeak, IEat
{
public Dog(string Name) : base(Name) { }
public void Eat()
{
Console.WriteLine("我是一只狗,名字:["+base._name+"],我在吃狗粮!");
} public void Speak()
{
Console.WriteLine("我是一只狗,名字:[" + base._name + "],汪汪汪!");
}
//定义一个隐式转换
public static implicit operator Cat(Dog dog)
{
return new Cat(dog._name);//new 会改变Animal.Count
}
}
//猫类,继承自动物,实现接口
class Cat : Animal, ISpeak, IEat
{
public Cat(string Name) : base(Name) { }
public void Eat()
{
Console.WriteLine("我是一只猫,名字:[" + base._name + "],我在吃小鱼干~");
} public void Speak()
{
Console.WriteLine("我是一只猫,名字:[" + base._name + "],喵~");
} //定义一个显式转换
public static explicit operator Dog(Cat cat)
{
return new Dog(cat._name);//new 会改变Animal.Count
}
}
//静态类 扩展方法
static class DogJump
{
public static void Jump(this Dog dog)
{
Console.WriteLine(dog + " is jumping...");
}
public static string PrintKeys(this Dictionary<int, Animal> dic)
{
var s="";
foreach (var item in dic.Keys)
{
s += item;
s += ", ";
}
return s;
}
public static string PrintValues(this Dictionary<int, Animal> dic)
{
var s = "";
foreach (var item in dic.Values)
{
s += item;
s += ", ";
}
return s;
}
} //定义一个客户类
class Client
{
public void WantAnimal()
{
Console.WriteLine("Great! I wanna see it!");
}
} }
C# 初学的更多相关文章
- DDD初学指南
去年就打算总结一下,结果新换的工作特别忙,就迟迟没有认真动手.主要内容是很多初学DDD甚至于学习很长时间的同学没有弄明白DDD是什么,适合什么情况.这世界上没有银弹,抛开了适合的场景孤立的去研究DDD ...
- gulp初学
原文地址:gulp初学 至于gulp与grunt的区别,用过的人都略知一二,总的来说就是2点: 1.gulp的gulpfile.js 配置简单而且更容易阅读和维护.之所以如此,是因为它们的工作方式不 ...
- 初学seaJs模块化开发,利用grunt打包,减少http请求
原文地址:初学seaJs模块化开发,利用grunt打包,减少http请求 未压缩合并的演示地址:demo2 学习seaJs的模块化开发,适合对seajs基础有所了解的同学看,目录结构 js — —di ...
- 初学Vue2.0--基础篇
概述: 鉴于本人初学,使用的编译器是webStorm,需添加对VUE的支持,添加方法可以参考 http://www.jianshu.com/p/142dae4f8b51. 起步: 1. 扎实的 Jav ...
- 初学Python
初学Python 1.Python初识 life is short you need python--龟叔名言 Python是一种简洁优美语法接近自然语言的一种全栈开发语言,由"龟叔&quo ...
- Javascript初学篇章_5(对象)
对象 Javascript是一种面向对象的语言,因此可以使用面向对象的思想来进行javascript程序设计对象就是由一些彼此相关的属性和方法集合在一起而构成的一个数据实体.举个例子,一只猫是个对象, ...
- 初学Objective-C语言需要了解的星星点点
其实大多数开发初学者都有一些相同的特点,可以说是一种“职业病”.Most有其他平台开发基础的初学者,看到Xcode就想摩拳擦掌:看到Interface Builder就想跃跃欲试:而 ...
- matlab初学之句柄
文章出处:http://www.cnblogs.com/CBDoctor/archive/2012/04/06/2434072.html 在matlab中,每一个对象都有一个数字来标识,叫做句柄.当每 ...
- 初学HTML5、初入前端
学习HTML5是一个漫长的过程,当中会遇到很多技术与心态上的变化.刚开始学习,我们不能发力过猛,需要一个相对稳定的状态去面对.多关注一些自己感兴趣的网站和技术知识,建立自己的信心与好奇心,为以后的学习 ...
- Python初学的易犯错误
当初学 Python 时,想要弄懂 Python 的错误信息的含义可能有点复杂.这里列出了常见的的一些让你程序 crash 的运行时错误. 1)忘记在 if , elif , else , for , ...
随机推荐
- drools规则引擎初探
https://www.cnblogs.com/yuebintse/p/5767996.html 1.drools是什么 Drools是为Java量身定制的基于Charles Forgy的RETE算 ...
- [Windows Azure] Building worker role B (email sender) for the Windows Azure Email Service application - 5 of 5.
Building worker role B (email sender) for the Windows Azure Email Service application - 5 of 5. This ...
- 每日英语:Boost Your Balance; Avoid Falls
If you find yourself needing to sit down to take off your shoes, it might be time to start paying at ...
- 关于go1.6使用vendor的坑
基本命令是:$ govendor init$ govendor add +external 坑:如果在govendor之前,修改过go get的包源代码,那么必须在该包目录里git commit这个修 ...
- js判断网页是真静态还是伪静态的方法
现在很多网站都是使用以“.html“为扩展名的网页,这样做的好处是有利于搜索引擎收录和排名,或者是其他目的,如可以缩短网址使人容易记住.不过有意思的是并不是所有的以“.html”扩展名的网页都是静态的 ...
- js实现复制功能,将需要复制的内容放入剪切板上
方法一:使用ZeroClipboard.js插件 <html> <head> <meta charset="UTF-8"> </head& ...
- 1. AutoEncoder介绍
1. AutoEncoder介绍 2. Applications of AutoEncoder in NLP 3. Recursive Autoencoder(递归自动编码器) 4. Stacked ...
- Eigen教程(9)
整理下Eigen库的教程,参考:http://eigen.tuxfamily.org/dox/index.html Eigen并没有为matrix提供直接的Reshape和Slicing的API,但是 ...
- MAMP和WAMP搭建Web环境,数据库,数据分布可视化
MAMP和WAMP搭建Web环境,数据库,数据分布可视化 1. 数据库 用MAMP和WAMP搭建Web环境,数据分布可视化 Web环境Web服务器:Apache.Nginx,处理Web请求数据库:My ...
- Web程序中的懒加载异常说明及解决方案
所谓懒加载(lazy)就是延时加载,延迟加载. 什么时候用懒加载呢,我只能回答要用懒加载的时候就用懒加载. 至于为什么要用懒加载呢,就是当我们要访问的数据量过大时,明显用缓存不太合适, 因为内存容量有 ...