C# - 常見問題整理

關於循環和try{}..catch{}的嵌套使用html

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 集合已修改;可能沒法執行枚舉操做數據庫

引用變量做爲入參傳遞的問題
Dictionary<String, int>變量obj做爲方法入參inPar,在方法中給inPar直接賦值,並不會影響obj的值。
由於入參inPar是obj的副本,若要影響obj的值,加上ref引用便可。後端

數組和鏈表初始化問題數組

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");

字符串操做ide

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()直接返回字段名

文件讀寫
FileStream fs = new FileStream(url, FileMode.Open, FileAccess.Read);
提示報錯:文件正由另外一進程使用,所以該進程沒法訪問此文件。
緣由:考慮文件可能有讀寫操做,只讀方式須搭配共享鎖
解決:FileStream fs = new FileStream(url, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
詳情參見:FileShare

控制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;
}

具體參見:窗體按鈕顯示控制方法簡談

相關文章
相關標籤/搜索