.net基础

.net基础提升之.net和C#关系、运行过程、数据类型、类型转换、值类型和引用类型、数组以及方法参数等

1..net 和 C# 的关系
.net 是一个平台,C#是种语言,C#语言可以通过。net平台来编写、部署、运行。net应用程序,C#通过。net平台开发。net应用程序
2.。net平台的重要组成
FCL - 框架类库,即微软事先定义好的类的集合
CLR - 公共语言运行时,即创建、部署、运行。net的必备环境
3.C#源代码的运行过程
通过csc命令将C#源代码编译成exe文件,即程序集,由MSIL(微软中间语言)组成,双击运行,通过CLR公共语言运行时,由于CPU只认识二进制代码,所以JIT会将程序集的微软中间语言转换为本地平台的CPU指令(即二进制代码)并将指令发给CPU执行。
(1)不是所有的exe文件都叫程序集,只有通过csc命令编译的成的文件才叫程序集
(2).net平台是一个跨语言的平台,可以通过C#、VB等语言来开发。net应用程序
4.数据类型
(1)内存的访问速度特别快
(2)在内存里开辟空间的时候要指定空间的类型
(3)每一种数据类型在内存中开辟多大的空间是根据这个数据类型的最大值来确定的
(4)数据类型就是内存中开辟空间大小的一个模板
(5)预定义数据类型:微软事先规定好开辟空间的大小的模板。
(6)变量就是开辟的那块空间
(7)变量的类型:就是为这个空间取得的别名
(8)变量的值:就是这块空间的值
5.类型转换
Parse方法转换字符串和Convert转换字符串的区别:
Convert方法内部就是调用Parse方法转换,只不过在转换之前先判断字符串是否为null,比如转换int时为null值返回0,不会抛出异常
6.值类型和引用类型
值类型:比如数值类型 char bool 枚举 结构等,直接将数据存储在栈里的变量的空间里面
引用类型:string 数值 类,变量声明在栈里面,真实的对象存储在堆里面,栈里面的变量存储的是对象的地址

将一个变量赋值给另外一个变量:无论如何都是将变量的值拷贝一份进行赋值,不同的是引用类型的变量里存储的是地址,所以导致了传递的地址指的是同一个对象。
7.流程控制
switch只能判断等值,if else可以判断等值也可以判断范围
for(int i=0;;i++)判断条件不写,永远为true
{

}
for (; ;)死循环 
{

}
8.二维数组
int[,] array = new int [2,3];//表示2行3列的二维数组
Console.WriteLine(array.Length);//数组长度为6
Console.WriteLine(array.Rank);//表示数组的维数 2
for (int i = 0; i < array.GetLength(0); i++)// array.GetLength(0) 获取数组指定维度的长度
{
for (int j = 0; j < array.GetLength(1); j++)
{
Console.WriteLine(array[i,j]);
}
}
int[, ,] array = new int[2, 3, 4];//三维数组
9.交错数组
//交错数组,交错数组的本质是一个一维数组,只不过这个一维数组的元素又是数组
int[][] array = new int[2][];//表示有两个int类型的数组int[] int[]
array[0] = new int[3];
array[0][0] = 1;
array[0][1] = 2;
array[0][2] = 3;
array[1] = new int[1];
array[1][0] = 1;
foreach (int[] item in array)
{
foreach (int i in item)
{
Console.WriteLine(i);

}
int[][][] array = new int[2][][];//交错数组
10.方法重载和可变参数parames
方法名称相同,方法的参数个数或者类型或者参数顺序不同并且在同一个类中就叫做方法重载
可变参数Test(parames int[] array,int i)只能放在参数最后面,因为在调用方法时可以直接进行元素传递,用逗号分隔,程序不知道逗号的真正意义是什么
11.ref和out参数
ref和out传递的都是变量的地址
ref侧重于修改,out侧重于输出值
ref在传递之前必须要有值,因为在方法中有可能会用到这个参数的值,out在传递之前可以没有值,因为在方法中必须为这个变量赋值

ASP.NET

 
摘要: 1..net 和 C# 的关系.net 是一个平台,C#是种语言,C#语言可以通过。net平台来编写、部署、运行。net应用程序,C#通过。net平台开发。net应用程序2.。net平台的重要组成FCL - 框架类库,即微软事先定义好的类的集合CLR - 公共语言运行时,即创建、部署、运行。net的必备环境3.C#源代码的运行过程通过csc命令将C#源代码编译成exe文件,即程序集,由MSIL(微软中间语言)组成,双击运行,通过CLR公共语言运行时,由于CPU只认识二进制代码,所以JIT会将程序集的微软中间语言转换为本地平台的CPU指令(即二进制代码)并将指令发给CPU执行。(1)不是所有的e阅读全文
posted @ 2013-10-17 22:00 szyuxueliang 阅读(25) | 评论 (0) 编辑
摘要: 1.自动属性 Auto-Implemented Properties2.隐式类型 var var变量不能作为全局变量使用,因为不能在编译时确定类型3.参数默认值 和 命名参数4.对象初始化器 与 集合初始化器 { }Person p = new Person(){ Name="aa",Age=18};//属性初始化器List list = new List(){new Person(){ Name="aa",Age=18},new Person(){ Name="bb",Age=18}};//集合初始化器5.匿名类 & 匿名方阅读全文
posted @ 2013-10-13 09:27 szyuxueliang 阅读(8) | 评论 (0) 编辑
摘要: 1.新建一个报表,设置报表之后,使用强类型的DataSet xsd 配置数据源,对报表中的使用最常用的是文本框和表格控件2.新增WebForm窗体,拖一个ReportViewer控件,在WebForm中写入以下代码:WebForm html: 兑奖时间: -- 使用ReportViewer时必须使用ScriptManager控件后端代码 protecte...阅读全文
posted @ 2013-10-10 17:50 szyuxueliang 阅读(2) | 评论 (0) 编辑
摘要: 之前在博客园有幸从网友那里得知一个C#的模型验证组件(哈 不知道这样表述正确不),组件的功能比较简单,主要是实现了对Model的验证,例如验证用户名是否为空,密码长度是不是多余6个字符,当然还有其他更加灵活的的验证方法。这里介绍给大家知道一下!该组件的名称叫“FluentValidation”,顾名思义——“流畅验证”(- -!)。 下面看一段官方网站上面给出的代码就知道为什么“流畅”了。代码如下:using FluentValidation;public class CustomerValidator: AbstractValidator { public CustomerValidato.阅读全文
posted @ 2013-09-21 09:32 szyuxueliang 阅读(9) | 评论 (0) 编辑
摘要: 1. Elmah使用后,在发布时,要区分IIS6和IIS7 ,IIS6下 HttpModules必须在web.config或App.config 配置文件中使用 system.web注册,而IIS7 必须使用 sysem.webserver.IIS6:1 2 3 4 5 IIS7:1 2 3 4 5 令外介绍下Elmah使用,这个是一款ASP.NET下的系统错误记录管理工具。 下载相应的dll,引用到project. 如果想记录在数据库,必须建立一张错误记录表。web.config配置如下. 1 2 3 4 ...阅读全文
posted @ 2013-09-18 14:26 szyuxueliang 阅读(9) | 评论 (0) 编辑
摘要: TransactionScope是.Net Framework 2.0滞后,新增了一个名称空间。它的用途是为数据库访问提供了一个“轻量级”[区别于:SqlTransaction]的事物。使用之前必须添加对 System.Transactions.dll 的引用。 下列代码就是一个正在创建的事务,这个事务自身还封装了多个数据库查询。只要任意一个 SqlCommand 对象引发异常,程序流控制就会跳出 TransactionScope 的 using 语句块,随后,TransactionScope 将自行释放并回滚该事务。由于这段代码使用了 using 语句,所以 SqlConnection 对象阅读全文
posted @ 2013-09-12 22:58 szyuxueliang 阅读(5) | 评论 (0) 编辑
摘要: market@51xieyun.com阅读全文
posted @ 2013-09-09 14:10 szyuxueliang 阅读(6) | 评论 (0) 编辑
摘要: Linq 中按照多个值进行分组(GroupBy)/// 要查询的对象class Employee { public int ID { get;set; } public string FName { get; set; } public int Age { get; set; } public char Sex { get; set; }}如果对这个类的Age和Sex的连个字段进行分组,方法如下:// 先造一些数据List empList = new List();empList.Add(new Employee() { ID = 1, FName = "John", Ag阅读全文
posted @ 2013-07-29 11:14 szyuxueliang 阅读(41) | 评论 (0) 编辑
摘要: 1.使用定时框架Quartz.Net创建索引库,引用类库文件有Common.Logging.dll、Lucene.Net.dll,PanGu.dll,PanGu.HighLight.dll,PanGu.Lucene.Analyzer.dll,Quartz.dllpublic class IndexJob:IJob { public void Execute(JobExecutionContext context) { //第一个版本应该保存body和title,搜索结果形成超链接,不显示正文。string indexPath = "e:/index"; FSDirector阅读全文
posted @ 2013-07-13 18:58 szyuxueliang 阅读(30) | 评论 (0) 编辑
摘要: //提供下载的文件,不编码的话文件名会乱码 private string fileName = HttpContext.Current.Server.UrlEncode("规范.rar"); private string filePath = HttpContext.Current.Server.MapPath("规范.rar"); //使用TransmifFile下载文件 protected void btnDL1_Click(object sender, EventArgs e) { FileInfo info = new FileInfo(file阅读全文
posted @ 2013-04-25 21:04 szyuxueliang 阅读(6) | 评论 (0) 编辑
摘要: /// <summary> /// MD5字符串加密 /// </summary> /// <param name="str">要加密的字符串</param> /// <returns></returns> public static string MD5Encrypt(string str) { using (MD5 md5 = MD5.Create()) { //对于中文或者某些字符,采用不同的编码生成的byte[]是不一样的, //所以造成了采用不同编码生成的md5值不一样的情况。 byte[] 阅读全文
posted @ 2013-04-23 17:38 szyuxueliang 阅读(13) | 评论 (0) 编辑
摘要: 昨天经过网友提醒,提取汉字拼音的方法可以使用微软的一个类库 Visual Studio International Pack ,今天试了一试,确实好用!下面分享下使用方法:首先下载Visual Studio International Pack 1.0,官方下载地址:http://www.microsoft.com/downloads/zh-cn/details.aspx?FamilyID=44CAC7F0-633B-477D-AED2-99AEE642FC10&displaylang=zh-cn。下载完毕后解压,解压后可以发现7个MSI安装文件,其中CHSPinYinConv.msi阅读全文
posted @ 2013-04-23 17:24 szyuxueliang 阅读(40) | 评论 (0) 编辑
摘要: Console.WriteLine("开始发送邮件...."); //1.MailMessage //1.创建一封邮件 MailMessage msg = new MailMessage(); msg.From = new MailAddress("szyuxueliang@163.com"); msg.To.Add(new MailAddress("1027206433@qq.com")); msg.Subject = "======去给我带份饭。======="; msg.SubjectEncoding = E阅读全文
posted @ 2013-04-23 17:16 szyuxueliang 阅读(20) | 评论 (0) 编辑
摘要: 1.RSS文件结构 示例: <?xml version="1.0" encoding="gb2312" ?> <rss version="2.0"> <channel> <title>我的Blog</title> //channel的标题 <description>与我自己的技术Blog相关联</description> //channel的介绍 <link>http://counter.csdn.net/pv.aspx?id=72<阅读全文
posted @ 2013-04-23 17:14 szyuxueliang 阅读(19) | 评论 (0) 编辑

面试奇葩——交换变量的一些邪门歪道

 

  交换两个变量的值,最常见的写法是

1
2
3
4
5
int i , j ;
int temp ;
temp = i ;
i = j ;
j = temp ;

  这种写法相信任何学过程序设计语言的都知道。

  然而有些着三不着两的极品面试官却喜欢追问,不用中间变量应该怎么写?这一追问不要紧,追出了很多邪门歪道,例如

1
2
3
4
int i , j ;
i = i + j;
j = i - j ;
i = i - j ;

  这样的写法,非常晦涩,但挡不住这样写的人为少定义了一个变量而洋洋得意。然而这样写真的行得通吗?运行一下下面的代码就明白了。 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#include <stdio.h>
#include <limits.h>
 
int main( void )
{
    
  int i , j ;
  int temp ;
   
  i = INT_MAX ;
  j = INT_MAX - 1;
   
  puts("交换前:");
  printf("i = %d , j = %d " , i , j );
   
  temp = i ;
  i = j ;
  j = temp ;
   
  puts("交换后:");
  printf("i = %d , j = %d " , i , j );
       
  i = INT_MAX ;
  j = INT_MAX - 1;
   
  puts("交换前:");
  printf("i = %d , j = %d " , i , j );
   
  i = i + j ;
  j = i - j ;
  j = i - j ;
   
  puts("交换后:");
  printf("i = %d , j = %d " , i , j );
 
  return 0;
}

  运行结果通常都是荒诞不经的。原因很简单, 计算 i + j 时发生溢出,而溢出在C语言中是一种未定义行为,所以得到什么样的荒诞结果都不奇怪。

  更极品的回答是用乘除法。 

1
2
3
i = i * j;
j = i / j;
i = i / j;

  这不明摆着更容易溢出吗?甚至会发生除以0的错误。可居然还有人认为“其实不然”,“不会溢出”。严重怀疑这是三鹿奶粉喝多了的后遗症。

  有的面试官可能自以为自己还没愚蠢到这种程度,因为他心目中的“标准答案”是通过异或运算。

1
2
3
i ^= j;
j ^= i;
i ^= j;

  这种写法虽然不会产生溢出,但使用条件受限,因为只能用于整数类型,浮点类型、结构体类型等完全不适用。而且除了少用了一个临时变量,没有其他任何好处。

  有些人天真地以为这种写法对于整数类型变量来说会更快,其实这种猜测毫无根据。很难说异或运算就比赋值快,据一份公开发表的数据,在某环境下,异或用时为0.050μs,而赋值运算只用0.036μs。

  就可读性而言,异或写法显然如同蝌蚪文天书。

  更有极品将异或写法发挥到了极限:

1
i ^= j ^= i ^= j;

  对于C语言来说,这种写法大错特错。因为C语言规定在两个序点之间同一个数据对象最多只能改变一次,否则就是未定义行为。(参见 “牙里长嘴”和“a+=a-=a*a” )这种代码压根就不可以写。如果运行结果碰巧正确,那么只是瞎猫碰上死耗子而已。况且已有报告称在某些环境下这种写法的运行结果是错误的。

  异或写法还有一个潜在的问题,比如

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#include <stdio.h>
 
void swap( int  * , int * );
 
int main( void )
{
    
  int i = 5 , j = 10 ;
   
  puts("交换前:");
  printf("i = %d , j = %d " , i , j );
   
  swap( & i , & j);
   
  puts("交换后:");
  printf("i = %d , j = %d " , i , j );
 
  //自己和自己交换
  puts("交换前:");
  printf("i = %d " , i );
   
  swap( & i , & i);
 
  puts("交换后:");
  printf("i = %d " , i );
 
  return 0;
}
 
void swap( int  * p , int * q )
{
   * p ^= * q ;
   * q ^= * p ;  
   * p ^= * q ;  
}

  这段代码运行的结果是:

交换前:

i = 5 , j = 10

交换后:

i = 10 , j = 5

交换前:

i = 10

交换后:

i = 0

  不难发现,如果swap()函数的两个实参为指向同一数据对象的指针时,结果是错误的。

  当然,你可能认为自己和自己交换有些无聊。但我们不能排除有些算法可能存在这种交换的可能性。

  除了这种可能性,还有另外一种可能性,那就是你把代码写错了,多写了一次不必要的变量自己和自己的交换。如果你用的是使用中间变量的算法,那么除了代码有瑕疵,运行结果的正确性还是有保证的。但如果你用的是异或的办法,软件灾难则是召之即来——保准比打车来的还快。

  所以结论就是,不要用异或的办法交换变量值。

  写到这里,本应打住。不过偶然兴起,心血来潮,随手一搜,竟发现还有更多的奇葩写法。

  某java-er竟然一本正经地提出下面两种方法: 

1
a = a + b - (b = a);
1
b = a + (a = b)*0; 

  我不清楚在java里这是否成立,但在C语言中,这都属于未定义行为。令人拍案的是,该java-er竟然洋洋得意地写到:

  "这是java语言写的,但是语言不分种类,任何方法都是通用的,推荐使用a=b+(b=a)*0和a^b的方法,有些环境也许会不通过,但是方法和思想不会错得"

  SHIT!

 
 
 
原文地址:https://www.cnblogs.com/Leo_wl/p/3375134.html