C# - 常见问题整理

关于循环和try{}..catch{}的嵌套使用

foreach(var item in items) {
    try {
        try{
        } catch(Exception ex) {
            throw; // 将异常抛到外层(要根据实际情况,决定是否throw)
        }    
    } catch(Exception ex) {
        continue; // or break; or return false; 视情况而定
    }
}

关于集合类的遍历操作问题

ConcurrentDictionary<string, string> ResDicCon = new ConcurrentDictionary<string, string>();
ResDicCon.TryAdd("0", "000"); ResDicCon.TryAdd("1", "111"); ResDicCon.TryAdd("2", "222"); ResDicCon.TryAdd("3", "333");
foreach (string key in ResDicCon.Keys) {
    string Str = null;  // ConcurrentDictionary遍历时,删除key是没问题的
    ResDicCon.TryRemove(key, out Str);
}
 
Dictionary<string, string> ResDic = new Dictionary<string, string>();
ResDic.Add("0", "000"); ResDic.Add("1", "111"); ResDic.Add("2", "222"); ResDic.Add("3", "333");
foreach (string key in ResDic.Keys) {
    // Dictionary遍历时,删除key会报错
    ResDic.Remove(key); // ResDic["2"] = "66"; 更改也会报错
}

Dictionary在foreach时,不支持删除或更改数据,否则:未处理 InvalidOperationException 集合已修改;可能无法执行枚举操作
数组和链表初始化问题

int[] CntTotalArr = new int[24];  // 数组长度24,每个元素为0
List<int> list = new List<int>(12); // 链表长度为0,最大容量为12

若要初始化列表长度,可参考如下方法

方法1:public List<int> list = new List<int>(new int[initial_size]);    
方法2:public List<int> ls = Lists.RepeatedDefault<int>(initial_size);   
public class Lists {
    public static List<T> RepeatedDefault<T>(int count) {
        return Repeated(default(T), count);
    }
    public static List<T> Repeated<T>(T value, int count) {
        List<T> ret = new List<T>(count);
        ret.AddRange(Enumerable.Repeat(value, count));
        return ret;
    }
}

文件重命名方法

  • Copy + Delete
  • File.Move(srcFileName, destFileName);
  • FileInfo.MoveTo(destFileName);
  • VB.Net 中 My.Computer.FileSystem.RenameFile()
Computer MyComputer = new Computer();
MyComputer.FileSystem.RenameFile(FilePath, newFileName); 

添加引用:Microsoft.VisualBasic.dll,再加上using Microsoft.VisualBasic.Devices;
文件查找

// 查找方法1
DirectoryInfo Dir = new DirectoryInfo(directory);
FileInfo[] files = Dir.GetFiles(DateTime.Now.ToString("yyyyMMdd") + "*.xml");
// 查找方法2
string[] files = Directory.GetFiles(directory, DateTime.Now.ToString("yyyyMMdd") + "*.xml");

字符串操作

str.Replace("\r", "").Replace("\n", ""); 或 Regex.Replace(str, @"[\r\n]", ""); //去除换行符
Regex.Replace(str, " {2,}", ""); //多余空格

ADO.Net 与 ASP.Net
ADO.Net 是用于与数据库进行交互的面向对象类库,主要涉及:

  • SqlConnection类:连接和管理数据库链接
  • SqlCommand对象:发出针对数据库的SQL指令(增删改查)
  • SqlDataSet对象:数据在内存中的表示形式
  • SqlDataReader类:从数据库读取只进流的数据记录
  • SqlDataAdapter类:填充(fill)DataSet对象
  • SqlTransaction对象:数据库事务

ASP.Net 是.Net技术框架下的B/S(网页方向)框架技术,作为一种创建动态Web页的强大的服务器端技术,主要涉及:

  • Request对象(HttpRequest类):Page对象的成员之一,封装客户端的请求信息
  • Response对象(HttpResponse类):Page对象的成员之一,封装HTTP信息、响应客户浏览的网页
  • Cookie对象:记录客户端属性信息,存放在客户端,实现状态管理

注意,ASP.Net 不是一种语言。
VS新建各种项目的区别

//Windows程序
Windows窗体应用程序:WinForm(前后端C#)
WPF应用程序:进阶版,界面与逻辑分离(前端xaml,后端C#)
//Asp.net Web开发
ASP.Net Web应用程序:WebForm
ASP.Net MVC Web应用程序:进阶版,MVC分层解耦

[1]. WinForm .vs. WebForm

  • WinForm应用程序部署在客户端,用户通过专门为该程序打造的用户界面与其交互,WebForm应用程序部署在服务器端,用户通过浏览器与其交互
  • WinForm基于Windows桌面应用程序窗体,WebForm基于Web浏览器的网络应用程序窗体
  • WinForm是窗体模式,WebForm是浏览器模式

详情参见:关于ASP.NET WebForm与ASP.NET MVC的比较
[2]. WebForm .vs. MVC
两者均是ASP.Net Web应用程序开发的技术,基于ASP.Net,更深一层是基于.Net Framework。
WebForm支持控件拖拽,但存在问题

  • ViewState,页面重
  • 页面生命周期
  • html受限

详情参见:Why MVC is Better?
枚举enum

Enum.GetNames(typeof(EnumName)).Length #枚举类中元素个数
(int)返回数值,.ToString()直接返回字段名

猜你喜欢

转载自www.cnblogs.com/wjcx-sqh/p/11552693.html