linux的服务开机设置一般在 /etc/init.d/里
而jexus的默认安装目录在 /usr/jexus里 启动文件为 jws 参数 有start stop restart
这里贡献一个刚写好的jexus的开启启动脚本
1 |
|
最后记得 sudo chmod +x /etc/init.d/jws
添加自动启动服务 sudo update-rc.d jws defaults
删除自动启动服务 sudo update-rc.d jws remove
linux的服务开机设置一般在 /etc/init.d/里
而jexus的默认安装目录在 /usr/jexus里 启动文件为 jws 参数 有start stop restart
这里贡献一个刚写好的jexus的开启启动脚本
1 | #!/bin/bash |
最后记得 sudo chmod +x /etc/init.d/jws
添加自动启动服务 sudo update-rc.d jws defaults
删除自动启动服务 sudo update-rc.d jws remove
程序的执行不只是根据代码的先后顺序,可以使用条件控制语句和循环语句对代码的执行加以控制
根据条件 来判断是否执行相应的代码 关键字:有 if,switch
if和else和配合起来会使用 if 后面是个小括号,小括号里面是要判断的特定的条件,条件结果是bool类型。紧跟着条件结果为true的时候要执行的代码,如果是多行代码需要使用大括号{}括起来。如果条件结果是false,则执行其后紧跟着的else后面的代码,同样如果是多行代码需要用大括号括起来 else后面也可以继续加if判断 代码示例:
int i = 1;
if (i > 0)
{
Console.WriteLine("i大于0");
}
else
{
Console.WriteLine("i不大于0");
}
执行结果: i不大于0
//int i = 1;
int i = -1;
if (i > 0)
{
Console.WriteLine("i大于0");
}
else
{
Console.WriteLine("i不大于0");
}
执行结果: i大于0
switch和case一起使用 当在一组互斥的分支中需要选择一个执行的时候使用。但switch参数里的值等于case后面的值的时候,执行case的代码 代码示例:
int i = -1;
switch (i)
{
case 0:
Console.WriteLine("当前i为0");
break;
case 1:
Console.WriteLine("当前i为1");
break;
case -1:
Console.WriteLine("当前i为-1");
break;
default:
break;
}
执行结果: 当前i为-1
是代码在满足了一定的条件可以重复的执行的关键语句 主要有:for、foreach、while、do… while
先来看个for语句执行的经典的例子
for (int i = 0; i < 3; i++)
{
Console.WriteLine(i.ToString());
}
执行结果: 0 1 2 其中代码中 a. int i=0是第一次执行要运行的代码 b. i<10是迭代执行的时候需要判断的条件,如果这个条件结果不是true,for语句将执行结束 c. i++ 是每次循环执行的时候要计算的表达式 d. Console.WriteLine(i.ToString()); 是需要循环执行的代码 代码执行的顺序是 a->b->d->c->b->d->c->b->d->c->b(此时i=3 已经不满足i<3了 迭代结束)
与for相比foreach不需要那么繁琐 示例代码:
string[] strInfo = new string[] { "你好", "这里是", "http://yahui.wang" };
foreach (string item in strInfo)
{
Console.WriteLine(item);
}
执行结果: 你好 这里是 http://yahui.wang
可以看出foreach遍历了一个集合,取到集合里所有的单元,并且在循环语句中使用这个单元
如果while里的表达式如果条件满足,将会执行while后大括号里的代码,条件不满足的时候跳出执行 代码示例:
int value = 0;
while (value<2)
{
Console.WriteLine("我执行了一次");
value++;
}
执行结果: 我执行了一次 我执行了一次
do while相当于while的另一个版本 区别在于先执行do后面大括号的代码 在进行while判断,也就是说 do后面大括号里的代码必定会执行一编 代码示例:
do
{
Console.WriteLine("我执行了一次");
} while (false)
执行结果: 我执行了一次
在代码执行的过程中跳到另一行代码执行或者跳出当前循环,结束当前代码段执行等起跳转作用的语句,包括:goto、break、continue、return、
从示例中学习
goto label;
Console.WriteLine("世界");
label:
Console.WriteLine("你好");
执行结果: 你好 说明:其中label:是一个名为label的标签;后面的代码是标记的代码,执行goto label的时候直接跳转到了label标记代码,中间的 Console.WriteLine(“世界”) 没有被执行。 goto不能跳转到循环关键字的代码块中,也不能跳出try catch 的finally代码块 但是在实际使用中,goto的口碑并不怎么好。不建议经常使用。
break可以跳出switch里的单个case ,也可以跳出for、foreach、while、do…while循环
continue是跳出此次循环,进入下个循环。在for、foreach、while、do…while中使用。
return结束一个函数的执行,给出一个函数的返回值,当一个函数没有返回值的时候 return只做结束当前函数使用 本文代码地址:https://github.com/yahue/JustDoIt-CSharp/tree/master/0003_Source/0003_Source
变量:顾名思义是一种会变化量,常量:声明赋值之后就不会再次改变的量
变量可以表示一个数值 、布尔值、字符串值或者一个类的对象。变量的值可以发生变。
1 | /* |
既是在使用过程中不会发生变化的常量,通常在前面加上一个 关键字 const, 需要注意的是:
1 | /** |
c#的数据类型分为值类型和引用类型,他们的区别在于存储和取值的方式不一样。
直接储存值,直接储存在堆栈中 下面看段代码来说明int类型是值类型的
1 | /* |
储存的是值的引用,储存在托管堆上 下面看段代码来更直观的看下引用类型 先定义一个对象 Person 对象是引用类型
1 | /// <summary> |
在Main方法里调用
1 | /* |
本文代码地址:https://github.com/yahue/JustDoIt-CSharp/tree/master/0002_Source/0002_Source
国际惯例,我们以一个Hello World程序来运行第一个C#程序
打开VS(VisualStudio2013 以下简称为VS)新建一个控制台项目 命名为HelloWorld
可以看到vs自动创建了Program.cs 代码文件 代码文本如下所示
1 | using System; |
vs窗口使用按F5快捷键或者点击工具栏的启动按钮 弹出一个控制台窗口打印出刚刚我们输入的 Hello World
这样一个后缀是cs的文本文件怎么就可以运行了呢,还在控制台里打印出了我们需要显示的东西 下面我们手动来编译一下 Program.cs 文件
VS2013
开发人员命令提示 快捷方式 进入命令行模式Program.cs
所在的文件夹 image 运行命令 csc Program.cs
如果现在您双击此文件,由于运行的太快了,你的眼睛只会捕捉到一个黑窗口一闪而过 我们还是使用命令执行它吧
新编译出的可执行程序执行也打印出了Hello World
刚刚我们自己编译的方式编译出了一个简单的控制台程序。和按下F5快捷键(或者鼠标点击下菜单栏的运行按钮)相比,我们输入了大量的指令。知道了vs的编译功能在做什么。
IDE
帮我们节省下来了大量的时间,接下来的时间里我们直接使用VS开发和学习C#就可以了。因为当我们知道原理之后像这样重复而又没意义的工作应该交给机器(程序)来完成,我们的时间要用到去做创新而又很酷的事情。
先简单说下注释:
注释不会执行 在代码中起到了对代码说明作用
单行注释 在// 后面写入您的注释 换行无效
多行注释 /开头/结尾 注释在中间 中间可以多行也可以一行 注:多行注释 里面不能有多行注释
下面就用注释的方式来说明Program.cs中的代码。也许会有一些您现在还不理解的名词,不用担心,通过学习的慢慢深入之后就会豁然开朗了。
1 | //这里使用using应用命名空间 |
CSharp 简写为c#,是一门非常年轻而又有活力的语言。
在2000年6月微软发布了c#这门新的语言。作为微软公司.NET 平台的主角,c#吸收了在他之前诞生的语言(c/c++、Visual Basic、Delphi、Java)的优点。也就是说在.NET平台下 c#可以轻易的使用面向对象的设计和实现出安全高效的程序。
经过十几年的发展,.NET 平台发展到了 4.5版本。提供了各种新的语言特征(3.0:lambda,linq等 4.0 :动态语言、可选参数和命名参数等)和开发框架(asp.net mvc、wcf、wpf、WWF),在其他语言中非常流行的开发框架(spring.framework、nhibernate、ibatis等)都得到了完美移植。
跨平台方面,借助mono.NET,可以开发在android、ios手机上运行的应用和手游,可以开发并部署在linux服务器上运行的网站以及其他后台应用程序。
曾经的微软帝国现在逐渐以一种开放的态度向的开发者示以好意,在github上,创建了asp.net、msopentech、donet、Microsoft 等开源地址,值得一提的是在2015年2月.NET Core的执行引擎 coreclr 也开源了。这标志了微软在开源和跨平台又向前迈出了一步。
c#的源代码已cs为后缀的文本文件,从文本文件的源代码到可以执行的c#经历了两个非常重要的编译阶段。
- 把源代码编译为Microsoft中间语言(IL)
- 公共语言动态库(CLR)把IL编译为平台专用的代码
由此可以看出 Microsoft(中间语言)IL发挥了非常大的作用。IL是一种低级语言,总是及时编译的,也称为JIT编译(JIT编译器只编译那一部份调用的代码,并且编译一次之后把本地可执行程序储存起来,在下次运行的时候直接运行本地程序 不用重新编译。)
不只是c#可以变成中间语言,vb、c++也可以编译成中间语言,也就是说c#可以轻松和这些可以编译成中间语言的高级语言互调用。
并且由编译过程中被编译成了中间语言可以看出c#的运行和平台无关。实现了中间语言运行环境即可让其运行。mono 项目就是一个很好的例子。 基于他的还有 xamarin、unity3d等
所以无论将c#作为入门语言还是作为程序员长期发展的语言来学习都是一个很好的选择。
扩展jquery的时候。最核心的方法是以下两种:
- $.extend(object) 可以理解为jquery添加一个静态方法
- $.fn.extend(object) 可以理解为jquery实例添加一个方法
1 | 例子: |
1 | /* $.fn.extend 定义与调用 |
为插件定义一个私有作用域。外界代码不能直接访问插件内部。插件内部代码不受外界干扰,也不会污染到全局变量。
1 | //step01 定义JQuery的作用域 |
1 | //step01 定义JQuery的作用域 |
1 | //step01 定义JQuery的作用域 |
其中:var options = $.extend(defaults, options)的含义了。表示 options 去覆盖了defaults的值,并把值赋给了options。
在插件环境中,就表示用户设置的值,覆盖了插件的默认值;如果用户没有设置默认值的属性,还是保留插件的默认值。
1 | //step01 定义JQuery的作用域 |
为了能达到链接调用的效果必须要把循环的每个元素return
1 | //step01 定义JQuery的作用域 |
在插件里定义的方法,外界不能直接调用,我在插件里定义的方法也没有污染外界环境。
1 | //step01 定义JQuery的作用域 |
如 我定义了一个事件信息的模型
[Serializable]
public class EventM
{
public string eventid { get; set; }
public string ownertype { get; set; }
public string owner { get; set; }
public string time { get; set; }
public string desp { get; set; }
public string handled { get; set; }
public string handleduser { get; set; }
public string handedtime { get; set; }
}
顺便有实例化了一个事件对象
EventM em = new EventM();
em.eventid = “1312”;
em.time = DateTime.Now.ToString();
em.owner = “某某人”;
em.ownertype = “太帅了”;
em.desp = “罚款100元”;
无聊 又感觉一个太少了 于是乎
List
for (int i = 0; i < 10; i++)
{
EventM em = new EventM();
em.eventid = “1312”;
em.time = DateTime.Now.ToString();
em.owner = “某某人”;
em.ownertype = “太帅了”;
em.desp = “罚款100元”;
emList1.Add(em);
}
下面进行序列化
XmlSerializer serializer = new XmlSerializer(emList1.GetType());
StringWriter writer = new StringWriter();
serializer.Serialize(writer, emList1);
writer.Close();
首先顶一个一个序列化对象serializer 然后是一个写入对象writer
开始对emList1序列化serializer.Serialize(writer, emList1); 并写入到writer里 最后要记得 writer.Close();的好习惯
结果
如果吧上段代码中的StringWriter 换成XmlWriter就可以得到一个xml文件 里面的代码为
下面是反序列化 我已经生成了一个xml文件xmltest.xml
反序列化代码如下
XmlSerializer serialize = new XmlSerializer(typeof(List<EventM>));
FileStream stream = new FileStream("xmltest.xml", FileMode.Open);
List<EventM> emList2 = new List<EventM>();
emList2 = (List<EventM>)serialize.Deserialize(stream);
stream.Close();
即可得到反序行列话之后的内容
由于我使用的要求不多 随意用的比较简单基础
还有一篇详细些的博客:
C#对象和XMl文件之间的转换
注:XmlSerializer 需要引用命名空间
using System.Xml.Serialization