突然对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# 初学的更多相关文章

  1. DDD初学指南

    去年就打算总结一下,结果新换的工作特别忙,就迟迟没有认真动手.主要内容是很多初学DDD甚至于学习很长时间的同学没有弄明白DDD是什么,适合什么情况.这世界上没有银弹,抛开了适合的场景孤立的去研究DDD ...

  2. gulp初学

    原文地址:gulp初学 至于gulp与grunt的区别,用过的人都略知一二,总的来说就是2点: 1.gulp的gulpfile.js  配置简单而且更容易阅读和维护.之所以如此,是因为它们的工作方式不 ...

  3. 初学seaJs模块化开发,利用grunt打包,减少http请求

    原文地址:初学seaJs模块化开发,利用grunt打包,减少http请求 未压缩合并的演示地址:demo2 学习seaJs的模块化开发,适合对seajs基础有所了解的同学看,目录结构 js — —di ...

  4. 初学Vue2.0--基础篇

    概述: 鉴于本人初学,使用的编译器是webStorm,需添加对VUE的支持,添加方法可以参考 http://www.jianshu.com/p/142dae4f8b51. 起步: 1. 扎实的 Jav ...

  5. 初学Python

    初学Python 1.Python初识 life is short you need python--龟叔名言 Python是一种简洁优美语法接近自然语言的一种全栈开发语言,由"龟叔&quo ...

  6. Javascript初学篇章_5(对象)

    对象 Javascript是一种面向对象的语言,因此可以使用面向对象的思想来进行javascript程序设计对象就是由一些彼此相关的属性和方法集合在一起而构成的一个数据实体.举个例子,一只猫是个对象, ...

  7. 初学Objective-C语言需要了解的星星点点

             其实大多数开发初学者都有一些相同的特点,可以说是一种“职业病”.Most有其他平台开发基础的初学者,看到Xcode就想摩拳擦掌:看到Interface Builder就想跃跃欲试:而 ...

  8. matlab初学之句柄

    文章出处:http://www.cnblogs.com/CBDoctor/archive/2012/04/06/2434072.html 在matlab中,每一个对象都有一个数字来标识,叫做句柄.当每 ...

  9. 初学HTML5、初入前端

    学习HTML5是一个漫长的过程,当中会遇到很多技术与心态上的变化.刚开始学习,我们不能发力过猛,需要一个相对稳定的状态去面对.多关注一些自己感兴趣的网站和技术知识,建立自己的信心与好奇心,为以后的学习 ...

  10. Python初学的易犯错误

    当初学 Python 时,想要弄懂 Python 的错误信息的含义可能有点复杂.这里列出了常见的的一些让你程序 crash 的运行时错误. 1)忘记在 if , elif , else , for , ...

随机推荐

  1. lua -- 事件响应与局部变量

    -- 这里要注意的点是:虽然nAmount是局部变量,却在控件的响应函数中使用 -- 因为控件的响应函数是在该变量的区域内,所以可以用 -- 如果控件的响应函数在外部,那么该变量就要声明成为全局变量 ...

  2. .NET MVC+ EF+通用存储过程实现增删改功能以及使用事物处理

    引摘: 1.EF对事务进行了封装:无论何时执行任何涉及Create,Update或Delete的查询,都会默认创建事务.当DbContext类上的SaveChanges()方法被调用时,事务就会提交, ...

  3. 移动WEB开发基础入门

    什么是移动WEB开发,我个人理解就是,将网页更好的显示在移动端的一些设置,简单来说就两点如下: 1.流式布局,即百分比自适应布局 将body下的div容器的样式设置如下: div{ width:100 ...

  4. 每日英语:Surviving a Conference Call

    The conference call is one of the most familiar rituals of office life -- and one of the most hated. ...

  5. DIOCP开源项目-Delphi高性能无锁队列(lock-free)

    最近想在DIOCP中加入任务调度线程,DIOCP的工作线程作为生产者(producer)将接受到的数据对象,投递到任务调度线程中,然后统一进行分配.然而这一切都需要一个队列, 这几天都在关注无锁队列. ...

  6. Beginning SDL 2.0(2) TwinklebearDev SDL 2.0 Tutorial

    本文整理并简要介绍了TwinklebearDev SDL 2.0 Tutorial相关内容(以下简称TDSDLTutorial). 这是作为我学习并了解SDL2.0功能一篇学习总结. TDSDLTut ...

  7. Oracle sql%rowcount 返回影响行数;sql server @@RowCount返回影响行数

    sql server中,返回影响行数是:If @@RowCount<1 Oracle中,返回影响行数是:If sql%rowcount<1 例: sqlserver: create pro ...

  8. 【机器学习】随机森林(Random Forest)

    随机森林是一个最近比较火的算法 它有很多的优点: 在数据集上表现良好 在当前的很多数据集上,相对其他算法有着很大的优势 它能够处理很高维度(feature很多)的数据,并且不用做特征选择 在训练完后, ...

  9. php 找出异常发生的地方

    多层嵌套发生异常,找到异常最早发生的地方. final public int Exception::getLine ( void ) final public string Exception::ge ...

  10. 04-老马jQuery教程-DOM节点操作及位置和大小

    1. jQuery创建DOM标签 1.1 DOM动态创建标签的方法 DOM时代我们通过document的createElement方法动态创建标签.创建标签后,动态的给他添加属性.例如代码: // 动 ...