关于循环和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问题注意

  • 常量需要限制conststatic readonly

关于log4net使用问题

log4net.Config.XmlConfigurator.Configure();直接运行程序有问题,须明确指明路径

log4net.Config.XmlConfigurator.Configure(new FileInfo("log4net.config路径"));

详见:日志记录工具-log4net

文件读写

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# - 常见问题整理的更多相关文章

  1. Maven使用常见问题整理

    Maven使用常见问题整理  1.更新eclipse的classpath加入新依赖  1.在dependencyManagement里面加入包括版本在内的依赖信息,如:   <dependenc ...

  2. LoadRunner常见问题整理(转)

    首先要感谢群友的无私分享,才能得到这篇好的学习资料,整理得太好了,所以收藏保存,方便以后学习. 一:LoadRunner常见问题整理 1.LR 脚本为空的解决方法: 1.去掉ie设置中的第三方支持取消 ...

  3. [转]LoadRunner脚本录制常见问题整理

    LoadRunner脚本录制常见问题整理 1.LoadRunner录制脚本时为什么不弹出IE浏览器? 当一台主机上安装多个浏览器时,LoadRunner录制脚本经常遇到不能打开浏览器的情况,可以用下面 ...

  4. [转帖]kubernetes 常见问题整理

    kubernetes 常见问题整理 https://www.cnblogs.com/qingfeng2010/p/10642408.html 使用kubectl 命令报错 报错: [root@k8s- ...

  5. LR常见问题整理

    1.LoadRunner录制脚本时为什么不弹出IE浏览器? 当一台主机上安装多个浏览器时,LoadRunner录制脚本经常遇到不能打开浏览器的情况,可以用下面的方法来解决. LR11 无法弹出ie浏览 ...

  6. Git 常见问题整理

    在学习git的过程中,遇到如下问题,特整理如下: 1 error:src refspec master does not match any 问题产生 a git服务器使用如下命令新建一个项目 $ c ...

  7. web标准常见问题整理

    1.超链接访问过后hover样式就不出现的问题 2.FF下如何使连续长字段自动换行 3.ff下为什么父容器的高度不能自适应 4. IE6的双倍边距BUG 5. IE6下绝对定位的容器内文本无法正常选择 ...

  8. Microsoft Mole原理及常见问题整理

     Moles与Moq(Rhino.Mocks)比较 作用范围 Moq与Rhino.Mocks这类的Mock是对Interface或AbstractClass做Mock, 而Moles是Mock整个 ...

  9. 手机移动端web前端常见问题整理

    移动端常见问题及解决方案 一.meta基础知识 H5页面窗口自动调整到设备宽度,并禁止用户缩放页面 <meta name="viewport" content="w ...

  10. Vue项目打包常见问题整理

    Vue 项目在开发时运行正常,打包发布后却出现各种报错,这里整理一下遇到的问题,以备忘. 1.js 路径问题 脚手架默认打包的路径为绝对路径,改为相对路径.修改 config/index.js 中 b ...

随机推荐

  1. 使用navicat的坑

    小黄人发送数据,测试软件是否将数据存入mysql数据库中,使用的是navicat. 首先截断了表,所有数据清零,但是此时表并没有回到第一页[由于前面查看最新数据,已经翻到了最后一页],然后小黄人发数据 ...

  2. Linux记录-SVN+Jenkins+jdk+maven自动化集成部署

    1.svn部署 yum -y install subversion svnserve --version 查看版本 mkdir -p /usr/app/svn svnadmin create /usr ...

  3. WinForm,在另一个线程中更新Form中的数据(转)

    Form本身有线程,但对于一些耗时的操作,我们不希望在Form的线程中进行,因为会导致Form线程阻塞,产生假死的现象. 其他线程中操作Form中的控件,总出现“线程间操作无效: 从不是创建控件的线程 ...

  4. Xmanager教程

    简介 Xmanager是市场上领先的PC X服务器,可将X应用程序的强大功能带入Windows环境. 提供了强大的会话管理控制台,易于使用的X应用程序启动器,X服务器配置文件管理工具,SSH模块和高性 ...

  5. Mathtype安装与最简破解

    1.MathType资源 链接: https://pan.baidu.com/s/1UapJCcfU7Me_rIWdAe5nfw   提取码:   1y9i 2.破解 我之前的30天试用期过了,没来得 ...

  6. CEIWEI USBMonitor USB监控精灵 v2.3.2 USB过滤驱动 USB监控

    CEIWEI USBMonitor USB监控精灵 是一款监控USB端口协议分析软件,用于监控和分析USB设备协议,可以拦截.记录USB软件程序操作USB设备的In.Out数据包.支持监控分析USB票 ...

  7. nginx配置访问本地静态资源

    下面说说如何在windows下使用nginx作为静态资源服务器, 1.修改config目录下,这个配置文件,基本上所有的配置都在这里面做, 2.主要的配置参数如下,一些无关的参数我直接去掉了,注意,里 ...

  8. 使用Jedis出现Connection refused的解决方案

    1.修改redis.conf配置文件中的   bind 127.0.0.1  为本机外网IP: 2. cluster-enabled yes  设置是否集群操作,如果是的话开启 yes,否的话 设置n ...

  9. SGE基本操作

    SGE怎样工作: 1. 接受用户投放的任务 2. 在任务运行以前,将任务放到一个存储区域 3. 发送任务到一个执行设备,并监控任务的运行 4. 运行结束写回结果并记录运行日志 常用的SGE命令: 1. ...

  10. eNSP——实现OSPF与ACL综合实验

    OSPF与ACL再前几个随笔中提到了,现在我们来做一个实例. 拓扑图: 实验案例要求: 1.企业内网运行OSPF路由协议,区域规划如图所示:2.财务和研发所在的区域不受其他区域链路不稳定性影响:3.R ...