环境:VS Express 2013 for Desktop 也可以vs社区版,不过学习的话,Express本版做一些小的上位机工具应该是够用了

学习的网站:https://www.runoob.com/csharp/

c#是微软开发的,面面相对象的编程语言,再加上微软的ide,开发起来效率比较高,适合个人维护(知乎上说的),感觉和c语言有点相似。

VS Express 2013 for Desktop 可以开发vb,vc#,vc++,比Microsoft Visual C# 2010强大多了。两者同样都是免费的,win7就安装Microsoft Visual C# 2010

新建工程后,

默认开头就有以下代码,类似于c++的using namaspace std

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

以下是学习的笔记

1、其中main函数默认是void类型的,就意味着不用返回值。和c语言的不一样,c的标准是必须int类型,

如果是int类型,编译器会提示错误错误

1    “RectangleApplication.ExecuteRectangle.Main(string[])”: 并非所有的代码路径都返回值    d:\visual studio 2013\Projects\csharphello\csharphello\Program.cs    66    20    csharphello

2、在 C# 中没有全局变量的概念,所有变量必须由该类的实例进行操作,这样做提升了安全性,但是在某些情况下却显得力不从心。

因此,我们在保存一些类的公共信息时,就会使用静态变量。

static <data_type> <variable_name> = value;

在变量之前加上 static 关键字,即可声明为静态变量。

3、方法的局部变量必须在代码中显式初始化,之后才能在语句中使用它们的值。此时,初始化不是在声明该变量时进行的,但编译器会通过方法检查所有可能的路径,如果检测到局部变量在初始化之前就使用了它的值,就会产生错误。

例如:

public static int Main(){
int d;
Console.WriteLine(d);
}

在这段代码中,演示了如何定义 Main(),使之返回一个 int 类型的数据,而不是 void。但在编译这些代码时,会得到下面的错误消息:

 Use of unassigned local variable 'd' 

正确的做法是初始化它 int d = 0 或者其他值。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; //一般在程序开头添加 using System;,这时 string 相当于 System.String 。
namespace csharphello
{
class Program
{ } } //namespace HelloWorldApplication
//{
// class HelloWorld
// {
// static void Main(string[] args)
// {
// /* 我的第一个 C# 程序*/
// Console.WriteLine("Hello World");
// Console.ReadKey();
// }
// }
//} namespace RectangleApplication
{
class Class1
{ } class Class2 : Class1 //类Class2是类Class1的子类
{ }
class Rectangle
{
// 成员变量
double length;
double width;
public void Acceptdetails()//一个用来赋值的方法
{
length = 4.5;
width = 3.5;
}
public double GetArea()//一个用来计算的方法
{
return length * width;
}
public void Display()//一个用来打印的方法
{
Console.WriteLine("Length: {0}", length);
Console.WriteLine("Width: {0}", width);
Console.WriteLine("Area: {0}", GetArea());//打印GetArea方法的计算结果
}
} class ExecuteRectangle
{
static void Main(string[] args)//程序入口方法,创建实例,调用相应的方法
{
Rectangle r = new Rectangle(); //类的实例化
r.Acceptdetails();//其实是用来声明前面 Acceptdetails() 和 Display()。
r.Display(); /*当 WriteLine() 函数有多个参数时,输出第一个参数中的内容,
* 而第二个参数中的内容替换掉第一个参数中对应位置的占位符一起输出.
* 如果第一个参数没有留占位符,那么第二个参数内容不输出.
*
static void Main(string[] args)
{
Console.WriteLine("A:{0},a:{1}",65,97);
Console.ReadLine();
}
运行结果: A:65,a:97
当 WriteLine() 函数有多个参数时,输出第一个参数中的内容,而第二个参数中的内容替换掉第一个参数中对应位置的占位符一起输出。 如果第一个参数没有留占位符,那么第二个参数内容不输出. Console.WriteLine("A:,a:",65,97);
运行结果: A:,a:
占位符从零开始计数,且占位符中的数字不能大于第二个参数的个数减一(要求占位符必须有可替换的值). 占位符数字与第二个参数字符位置一一对应. static void Main(string[] args)
{
Console.WriteLine("A:{1},a:{0}",65,97);
Console.ReadLine();
}
运行结果: A:97,a:65
* / /*
* 隐式转换:C# 默认的以安全方式进行的转换。
* 本质是从小存储容量数据类型自动转换为大存储容量数据类型,
* 从派生类转换为基类。
*/
int inum = 100;
long lnum = inum; // 进行了隐式转换,将 int 型(数据范围小)数据转换为了 long 型(数据范围大)的数据
Class1 c1 = new Class2(); // 这里也是隐式转换,将一个新建的 Class2 实例转换为了其基类 Class1 类型的实例 C1
Class1 c11 = new Class1();
//Class2 c22 = c11 as Class2; //使用as进行显式转换
Class2 c22 = new Class2();
Console.WriteLine(c11 is Class1);
Console.WriteLine(c22 is Class2); //类型之间的转换 - Convert 和 Parse
string locstr = 123.ToString(); Console.WriteLine(locstr); //如果要将"locstr"转成整型数 //方法一: 用 Convert
int i16 = Convert.ToInt16(locstr); //方法二: 用 Parse
int ii = int.Parse(locstr); Console.WriteLine(i16);
Console.WriteLine(ii); /*
int.TryParse(string s,out int i)
* 该方式也是将数字内容的字符串转换为int类型,
* 但是该方式比int.Parse(string s) 好一些,
* 它不会出现异常,最后一个参数result是输出值,
* 如果转换成功则输出相应的值,转换失败则输出0。
*/
string s1 = "abcd";
string s2 = "1234";
int a, b;
bool bo1 = int.TryParse(s1, out a);
Console.WriteLine(s1 + " " + bo1 + " " + a);
bool bo2 = int.TryParse(s2, out b);
Console.WriteLine(s2 + " " + bo2 + " " + b); int aa = 9;
object obj;
obj = aa;
obj = 10;
Console.WriteLine("2: {0}", aa); // 输出:2: 9
Console.WriteLine("1: {0}", obj); // 输出:1: 10 /*
* 关于值类型、引用类型以及“栈”跟“堆”的关系
* 值类型,声明一个值类型的时候,是在“栈”中开辟一个内存空间来存放对应的值,
* 当值类型的值发生改变的时候,则直接修改该内存空间所保存的值。例:
*/
int n1 = 5;
int n2 = n1;
Console.WriteLine(n1 + " "+ n2); // 5 5
n2 = 7;
Console.WriteLine(n1 + " " + n2); // 5 7 /*
*
* 这里首先在“栈”中开辟一个内存空间用来保存 n1 的值 5,
* 接着再在“栈”中开辟一个新的内存空间用来保存 n2 的值 5,
* 所以显示出来的结果是 5 5。然后将 n2 在“栈”中对应的内存空间保存的值修改成 7,
* 故显示出来的结果是 5 7。引用类型,声明一个引用类型的时候,
* 首先是在“堆”中开辟一个内存空间来存放对应的值,
* 然后在“栈”中开辟一个内存空间用于保存在“堆”中开辟的内存空间的地址。
* 当系统调用引用类型的时候,首先去“栈”中获取到地址,
* 然后根据地址在“堆”中找到对应的内存空间来获取到对应值。
* 像数组这样的引用类型
*/
string[] a1 = new string[] { "a", "b", "c" };
string[] a2 = a1;
for (int i = 0; i < a2.Length; i++)
{
Console.Write(a2[i] + " "); //a b c
}
a1[2] = "d";
Console.WriteLine(); //换行
for (int i = 0; i < a2.Length; i++)
{
Console.Write(a2[i] + " "); //a b d
} /*
* 这里首先是在“堆”中开辟一个内存空间(假设:0X55)用来保存数组a1的值,
* 然后在“栈”中开辟一个内存空间(a1)用于保存地址 0X55。当将 a1 赋给 a2 时,
* 是将地址赋给 a2,即在“栈”中开辟一个内存空间(a2)用于保存地址 0X55,
* 所以输出 a2 的值是 a b c。当将 a1[2]修改成”d”的时候,
* 修改的是“堆”中 0X55 内存空间保存的值,
* 因为 a2 的地址和 a1 的地址一样,所以输出结果是 a b d。
* 而 string 是一个特殊的引用类型,先看下面代码:
*/ string ast = "123";
string bs = ast;
Console.WriteLine(ast + " " + bs); //123 123
bs = "456";
Console.WriteLine(ast + " " + bs); //123 456 /*
* C# 中对 double 类型的数据取整,可以使用 convert.toint32() 方法,
* 也可使用 int 强制转换为整数,使用 int 时并不存在四舍五入的情况,而是直接将后面的小数位数丢掉。比如:
*
* 如此可见,我们在进行数据转换前选择转换方法要谨慎,如果是数字类型可以考虑直接用(int)强制转换,
* 如果是整型字符串类型的,考虑用 int.Parse() 进行转换,如果不是这两种类型,
* 再考虑用 Convert.ToInt32() 进行转换。
*/
double da = 1.35;
double db = 1.65;
int ua1 = Convert.ToInt32(da);
int ua2 = (int)(da);
int ub1 = Convert.ToInt32(db);
int ub2 = (int)(db);
Console.WriteLine("{0}使用convert方法转化的结果为:{1}", da, ua1);
Console.WriteLine("{0}使用int强制转换的结果为:{1}",da, ua2);
Console.WriteLine("{0}使用convert方法转化的结果为:{1}", db, ub1);
Console.WriteLine("{0}使用int强制转换的结果为:{1}", db, ub2); //ua1 = int.Parse("4.5"); //能编译,但是运行出错
Console.WriteLine(ua1); //a b c string stra = "123"; // 将stra设置为字符串“123”
int intx = int.Parse(stra); // 转换
Console.WriteLine(intx); //a b c try
{
Console.WriteLine("输入数字,将计算出它加一的答案");
intx = int.Parse(Console.ReadLine()); //有可能会抛出异常
Console.WriteLine("答案是{0}", ++intx); //如果没有异常,程序才会进入这一步
}
catch (Exception)
{
Console.WriteLine("无法转换"); //如果捕获到异常,就说“无法转换”
}
Console.ReadKey();
//Console.ReadLine();
}
}
}

c#语言学习笔记(1)的更多相关文章

  1. HTML语言学习笔记(会更新)

    # HTML语言学习笔记(会更新) 一个html文件是由一系列的元素和标签组成的. 标签: 1.<html></html> 表示该文件为超文本标记语言(HTML)编写的.成对出 ...

  2. 2017-04-21周C语言学习笔记

    C语言学习笔记:... --------------------------------- C语言学习笔记:学习程度的高低取决于.自学能力的高低.有的时候生活就是这样的.聪明的人有时候需要.用笨的方法 ...

  3. 2017-05-4-C语言学习笔记

    C语言学习笔记... ------------------------------------ Hello C语言:什么是程序:程序是指:完成某件事的既定方式和过程.计算机中的程序是指:为了让计算机执 ...

  4. GO语言学习笔记(一)

    GO语言学习笔记 1.数组切片slice:可动态增长的数组 2.错误处理流程关键字:defer panic recover 3.变量的初始化:以下效果一样 `var a int = 10` `var ...

  5. Haskell语言学习笔记(88)语言扩展(1)

    ExistentialQuantification {-# LANGUAGE ExistentialQuantification #-} 存在类型专用的语言扩展 Haskell语言学习笔记(73)Ex ...

  6. Go语言学习笔记十三: Map集合

    Go语言学习笔记十三: Map集合 Map在每种语言中基本都有,Java中是属于集合类Map,其包括HashMap, TreeMap等.而Python语言直接就属于一种类型,写法上比Java还简单. ...

  7. Go语言学习笔记十二: 范围(Range)

    Go语言学习笔记十二: 范围(Range) rang这个关键字主要用来遍历数组,切片,通道或Map.在数组和切片中返回索引值,在Map中返回key. 这个特别像python的方式.不过写法上比较怪异使 ...

  8. Go语言学习笔记十一: 切片(slice)

    Go语言学习笔记十一: 切片(slice) 切片这个概念我是从python语言中学到的,当时感觉这个东西真的比较好用.不像java语言写起来就比较繁琐.不过我觉得未来java语法也会支持的. 定义切片 ...

  9. Go语言学习笔记十: 结构体

    Go语言学习笔记十: 结构体 Go语言的结构体语法和C语言类似.而结构体这个概念就类似高级语言Java中的类. 结构体定义 结构体有两个关键字type和struct,中间夹着一个结构体名称.大括号里面 ...

  10. Go语言学习笔记九: 指针

    Go语言学习笔记九: 指针 指针的概念是当时学C语言时了解的.Go语言的指针感觉与C语言的没啥不同. 指针定义与使用 指针变量是保存内存地址的变量.其他变量保存的是数值,而指针变量保存的是内存地址.这 ...

随机推荐

  1. IntelliJ IDEA 常用快捷键 之 Windows 版

    IntelliJ IDEA(简称 IDEA),是 Java 语言开发的集成环境,IDEA 在业界被公认为最好的 Java 开发工具之一,尤其在智能代码助手.代码自动提示.重构.J2EE 支持.各类版本 ...

  2. dp --- 二维dp + 最大上升子序列

    <传送门> 滑雪 Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 74477   Accepted: 27574 ...

  3. springboot2.1.7整合mybati3.5.2与mysql8.0.13

    springboot2.x已经发布一段时间,博主在这里使用springboot2.1.7整合mybatis3.5.2,使用的数据库为mysql8.0.13 1. 导入依赖 <!--mysql-- ...

  4. 一秒可生成500万ID的分布式自增ID算法—雪花算法 (Snowflake,Delphi 版)

    概述 分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的. 有些时候我们希望能使用一种 ...

  5. JAVA知识点总结篇(二)

    数组 一维数组 声明 数据类型[] 数组名: 数据类型 数组名[]: 分配空间 数组名 = new 数据类型 [数组长度]: 可以在声明的同时分配空间,分配空间之后数组中才能放数据,数组元素都是通过下 ...

  6. Python 基础 while 循环

    Python 基础 while 循环 while 循环 在生活中,我们遇到过循环的事情吧?比如循环听歌.在程序中,也是存才的,这就是流程控制语句 while 基本循环 while 条件: # 循环体 ...

  7. sublime text 打开总是弹框报错Unable to download ChineseLocalizations. Please view the console for more details.解决办法

    本文链接:https://blog.csdn.net/qq_36435508/article/details/92805256 依次点击软件的    Preferences->Package S ...

  8. mongoDB对没有字段的记录新增字段

    db.getCollection('ClassRecordOneDetail').updateMany({'synState':{'$exists':false}},{'$set':{'synStat ...

  9. 两个div并排显示,当浏览器界面缩小时会出现换行

    解决:规定两个子div的父div的宽 <div id="showDataDiv" style="width: 1000px"> <div st ...

  10. 学习网络BGP必备基础知识

    外部网关协议,使用TCP作为传输层协议,支持CIDR,增量更新,距离矢量路由协议,无环路,路由策略丰富,可防止路由震荡,易于扩展. BGP概述 #BGP工作原理 之 报文类型 TCP三次握手 open ...