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 集合已修改;可能无法执行枚举操作
控制台程序关闭控制
public delegate bool ControlCtrlDelegate(int CtrlType);
[DllImport("kernel32.dll")]
private static extern bool SetConsoleCtrlHandler(ControlCtrlDelegate HandlerRoutine, bool Add);
private static ControlCtrlDelegate cancelHandler = new ControlCtrlDelegate(HandlerRoutine);
public static bool HandlerRoutine(int CtrlType) {
string tips = string.Empty;
switch (CtrlType) {
case 0: tips = "Ctrl+C关闭"; break;
case 2: tips = "控制台关闭按钮关闭"; break;
}
return false;
}
同时在main()方法中注册事件:SetConsoleCtrlHandler(cancelHandler, true);
引用变量作为入参传递的问题
Dictionary<String, int>变量obj作为方法入参inPar,在方法中给inPar直接赋值,并不会影响obj的值。
因为入参inPar是obj的副本,若要影响obj的值,加上ref引用即可。
类实例初始化问题
在父子类继承的情况下,子类对象创建并初始化方法
public class BaseVo {
public BaseVo() { }
public Dictionary<string, int> CntDic = new Dictionary<string, int>();
public virtual void Init(string _key) {
if (!this.CntDic.ContainsKey(_key)) { this.CntDic.Add(_key, 0); }
}
}
public class DerivedVo : BaseVo {
public DerivedVo() { }
public Dictionary<string, ModelVo> VoDic = new Dictionary<string, ModelVo>();
public override void Init(string _key) {
base.Init(_key);
if (!this.VoDic.ContainsKey(_key)) { this.VoDic.Add(_key, new ModelVo() { }); }
}
}
public class ModelVo { }
使用方式:DerivedVo dVo = new DerivedVo(); dVo.Init(_key);
数组和链表初始化问题
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,}", ""); //多余空格
字符串池机制
String s = new String("abc"); String r = "abc";
CLR启动时会在内部创建一个容器,键是字符串内容,而值是字符串在托管堆上的引用。当一个新字符串对象需要分配时,CLR首先检测内部容器中是否已有该字符串对象。若已经包含,则直接返回已经存在的字符串对象引用;若不存在,则新分配一个字符串对象,同时把其添加到内部容器里去。但是,当程序用new关键字显式地申明新分配的一个字符串对象时,该机制不会起作用。
byte[]与hex转换
public static string BytesToHex(byte[] bytes) {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < bytes.Length; i++) {
sb.AppendFormat("{0:X2}", bytes[i]);
}
return sb.ToString();
}
public static byte[] HexToBytes(string hex) {
byte[] bytes = new byte[hex.Length / 2];
for (int i = 0; i < bytes.Length; i++) {
bytes[i] = Convert.ToByte(hex.Substring(i * 2, 2), 16);
}
return bytes;
}
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()直接返回字段名
sonar问题注意
- 常量需要限制
const或static readonly
关于log4net使用问题
若log4net.Config.XmlConfigurator.Configure();直接运行程序有问题,须明确指明路径
log4net.Config.XmlConfigurator.Configure(new FileInfo("log4net.config路径"));
文件读写
FileStream fs = new FileStream(url, FileMode.Open, FileAccess.Read);
提示报错:文件正由另一进程使用,因此该进程无法访问此文件。
原因:考虑文件可能有读写操作,只读方式须搭配共享锁
解决:FileStream fs = new FileStream(url, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
详情参见:FileShare
若读文件File.ReadAllText结果中文乱码,需代入编码参数
System.Text.Encoding.Default 或 System.Text.Encoding.GetEncoding("gb2312")
控制winform窗口按钮方法
方法1:this.ControlBox = false; 但是会一起控制最大、最小、关闭按钮
方法2:可以单独控制关闭按钮
private const int CP_NOCLOSE_BUTTON = 0x200;
protected override CreateParams CreateParams {
get {
CreateParams myCp = base.CreateParams;
myCp.ClassStyle = myCp.ClassStyle | CP_NOCLOSE_BUTTON;
return myCp;
}
}
方法3:设置关闭按钮点击失效,须kill进程
this.FormClosing += new FormClosingEventHandler(FormClosingSelf);
private void FormClosingSelf(object sender, FormClosingEventArgs e)
{
this.WindowState = FormWindowState.Minimized;
e.Cancel = true;
}
具体参见:窗体按钮显示控制方法简谈
exe控制台程序关闭事件
public delegate bool ControlCtrlDelegate(int CtrlType);
[DllImport("kernel32.dll")]
private static extern bool SetConsoleCtrlHandler(ControlCtrlDelegate HandlerRoutine, bool Add);
private static ControlCtrlDelegate cancelHandler = new ControlCtrlDelegate(HandlerRoutine);
public static bool HandlerRoutine(int CtrlType) {
switch (CtrlType) {
case 0: Console.WriteLine("Ctrl+C关闭"); break;
case 2: Console.WriteLine("控制台关闭按钮关闭"); break;
}
return false;
}
需要在main方法中注册事件:SetConsoleCtrlHandler(cancelHandler, true);
C# - 常见问题整理的更多相关文章
- Maven使用常见问题整理
Maven使用常见问题整理 1.更新eclipse的classpath加入新依赖 1.在dependencyManagement里面加入包括版本在内的依赖信息,如: <dependenc ...
- LoadRunner常见问题整理(转)
首先要感谢群友的无私分享,才能得到这篇好的学习资料,整理得太好了,所以收藏保存,方便以后学习. 一:LoadRunner常见问题整理 1.LR 脚本为空的解决方法: 1.去掉ie设置中的第三方支持取消 ...
- [转]LoadRunner脚本录制常见问题整理
LoadRunner脚本录制常见问题整理 1.LoadRunner录制脚本时为什么不弹出IE浏览器? 当一台主机上安装多个浏览器时,LoadRunner录制脚本经常遇到不能打开浏览器的情况,可以用下面 ...
- [转帖]kubernetes 常见问题整理
kubernetes 常见问题整理 https://www.cnblogs.com/qingfeng2010/p/10642408.html 使用kubectl 命令报错 报错: [root@k8s- ...
- LR常见问题整理
1.LoadRunner录制脚本时为什么不弹出IE浏览器? 当一台主机上安装多个浏览器时,LoadRunner录制脚本经常遇到不能打开浏览器的情况,可以用下面的方法来解决. LR11 无法弹出ie浏览 ...
- Git 常见问题整理
在学习git的过程中,遇到如下问题,特整理如下: 1 error:src refspec master does not match any 问题产生 a git服务器使用如下命令新建一个项目 $ c ...
- web标准常见问题整理
1.超链接访问过后hover样式就不出现的问题 2.FF下如何使连续长字段自动换行 3.ff下为什么父容器的高度不能自适应 4. IE6的双倍边距BUG 5. IE6下绝对定位的容器内文本无法正常选择 ...
- Microsoft Mole原理及常见问题整理
Moles与Moq(Rhino.Mocks)比较 作用范围 Moq与Rhino.Mocks这类的Mock是对Interface或AbstractClass做Mock, 而Moles是Mock整个 ...
- 手机移动端web前端常见问题整理
移动端常见问题及解决方案 一.meta基础知识 H5页面窗口自动调整到设备宽度,并禁止用户缩放页面 <meta name="viewport" content="w ...
- Vue项目打包常见问题整理
Vue 项目在开发时运行正常,打包发布后却出现各种报错,这里整理一下遇到的问题,以备忘. 1.js 路径问题 脚手架默认打包的路径为绝对路径,改为相对路径.修改 config/index.js 中 b ...
随机推荐
- 使用wkhtmltopdf将多个html批量转成pdf
相关工具:wkhtmltopdf 场景:比如笔者有 ognl中文文档,全部是html,现在想把它转成pdf,放到ipad阅读,文件如下: 下载好wkhtmltox(本地安装目录 D:\develop\ ...
- 基于Python中numpy数组的合并实例讲解
基于Python中numpy数组的合并实例讲解 下面小编就为大家分享一篇基于Python中numpy数组的合并实例讲解,具有很好的参考价值,希望对大家有所帮助.一起跟随小编过来看看吧 Python中n ...
- LeetCode_226. Invert Binary Tree
226. Invert Binary Tree Easy Invert a binary tree. Example: Input: 4 / \ 2 7 / \ / \ 1 3 6 9 Output: ...
- 如何关闭phpstrom的更新提醒?
在file-----setting-------搜索updates 把检测版本更新的对勾点掉就可以了, 自己破解后的版本就别更新了,更新后就不能再用了,目前用代理服务器激活可以用版本3.3,升级到3. ...
- 安装Windows和Ubuntu双系统2
安装Windows和Ubuntu双系统 0.552016.12.10 15:54:41字数 2101阅读 6644 这几天开始动手做毕设啦,打算好好过把Linux瘾,接下来便是这两天我在联想电脑上安装 ...
- PWM原理及其在电源中的应用
熟悉单机片的同学就应该知道pwm,也就是脉冲宽度调制技术,它是通过对一系列脉冲的宽度进行调制,来获得等效的波形.是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术,因其操作简单,又灵活等 ...
- java jri null
java通过jri调用r文件,r文件必须和当前类在同一目录下,然后才能re.eval("source(fpath)")执行脚本;其中fpath为通过re.assign设置的文件全路 ...
- [转帖]再谈IO的异步,同步,阻塞和非阻塞
再谈IO的异步,同步,阻塞和非阻塞 https://yq.aliyun.com/articles/53674?spm=a2c4e.11155435.0.0.48bfe8efHUE8wg krypt ...
- [转帖]鲁大师Q3季度PC处理器排行:AMD、Intel终于五五开了
鲁大师Q3季度PC处理器排行:AMD.Intel终于五五开了 https://www.cnbeta.com/articles/tech/902375.htm 近日,鲁大师发布了Q3季度PC处理器排行. ...
- [转帖]HBase详解(很全面)
HBase详解(很全面) very long story 简单看了一遍 很多不明白的地方.. 2018-06-08 16:12:32 卢子墨 阅读数 34857更多 分类专栏: HBase [转自 ...