簡體   English   中英

我的using語句應該放在哪里? 在哪里放置試品?

[英]Where should my using statements go? And where to place the try catch?

我剛剛開始使用文件流,盡管我使代碼正常工作,但我也很想讓它變得漂亮:)我不知道在哪里放置using語句,因此可以跳過stream.Close(),以及最后如何使用try catch。 這是我的代碼,不是最漂亮的東西,但是可以。 雙文件流用於清除文件。

編輯:很抱歉發布的代碼片段臉紅很糟糕:P我已經發布了第二次嘗試:)

internal static void SaveFileAsTxt()
{
    FileStream streamer = new FileStream("Shipping2.txt", FileMode.Append, FileAccess.Write, FileShare.Write);
    streamer.Close();

    FileStream f = File.Open("Shipping2.txt", FileMode.Create);  
    f.Close();

    StreamWriter writer = new StreamWriter("Shipping2.txt", true, Encoding.ASCII);

    foreach (var shipment in _shipments)
    {
        string write = (shipment.Distance + ","+ shipment.Distance).ToString();
        writer.WriteLine(write);

    };

        writer.Close();
}


//--------new code--------


internal static void SaveFileAsTxt()
{
    if (File.Exists("Shipping2.txt"))
    {
        File.Delete("Shipping2.txt");
    }

    using (StreamWriter writer = new StreamWriter("Shipping2.txt", true, Encoding.ASCII))
    { 
        foreach (var shipment in _shipments)
        {
            string write = (shipment.Duration + ","+ shipment.Distance).ToString();
                        writer.WriteLine(write);
        }
    } 
}

您不需要多次打開文件-實際上,您實際上一次打開了三次 這應該沒問題; File.CreateText將截斷該文件(如果已存在),否則創建該文件:

// Are you *sure* you want to use ASCII? UTF-8 might be a better bet...
using (TextWriter writer = File.CreateText("Shipping2.txt", Encoding.ASCII))
{
    foreach (var shipment in _shipments)
    {
        // Removed redundant ToString call, and elided local variable.
        // Consider using a format string instead:
        // writer.WriteLine("{0},{1}", shipment.Distance, shipment.Distance);
        writer.WriteLine(shipment.Distance + "," + shipment.Distance);
    }
    // Removed empty statement (trailing semi-colon)
}

現在,您說要使用try / catch / finally-但是為什么呢? 如果您無法寫入文件,您肯定要用這種方法“處理”異常,而不是讓氣泡冒泡給調用者嗎?

您可以跳過前兩個FileStreams而僅使用StreamWriter ,它將為您創建一個文件:

// Single using
using (StreamWriter writer = new StreamWriter(
                                             "Shipping2.txt", 
                                             true, // !!!
                                             Encoding.ASCII))
{
       foreach (var shipment in _shipments)
       {
           string write = (shipment.Distance + "," + shipment.Distance)
                          .ToString();
           writer.WriteLine(write);
       }
}

MSDN:

public StreamWriter(
    string path,
    bool append,
    Encoding encoding
)

附加

類型:System.Boolean確定是否將數據附加到文件。 如果文件存在且append為false,則該文件將被覆蓋。 如果文件存在並且append為true,則將數據附加到文件中。 否則,將創建一個新文件

編輯:關於更新的問題(第二部分)

您不需要手動刪除文件,只需在StreamWriter構造函數中指定append = false,它將覆蓋文件:

如果文件存在並且append為false,則文件將被覆蓋

首先,我不了解這么多流的用法,但是您可以在許多地方使用use:

internal static void SaveFileAsTxt()
{
    using(var streamer = new FileStream("Shipping2.txt", FileMode.Append, FileAccess.Write, FileShare.Write))
    {

    }

    using(var f = File.Open("Shipping2.txt", FileMode.Create)) 
    {

    }

    using(var writer = new StreamWriter("Shipping2.txt", true, Encoding.ASCII))
    {
        foreach (var shipment in _shipments)
        {
            string write = (shipment.Distance + ","+ shipment.Distance).ToString();
            writer.WriteLine(write);

        };
    }
}

現在,您擁有的代碼與此等效:

internal static void SaveFileAsTxt() {
    using (FileStream streamer = new FileStream(
         "Shipping2.txt", FileMode.Append, FileAccess.Write, FileShare.Write
    );) {}

    using(FileStream f = File.Open("Shipping2.txt", FileMode.Create)) {}

    using(StreamWriter writer =
        new StreamWriter("Shipping2.txt", true, Encoding.ASCII)) {

        foreach (var shipment in _shipments) {
            string write = (shipment.Distance + "," + shipment.Distance).ToString();
            writer.WriteLine(write);
        }
    }
}

但是我不知道你為什么打開第一個文件。
關於第二個,我相信您嘗試使用此方法創建文件,
但是還有其他方法可以做到這一點。

只是有所不同,我將使用LINQ :-)

File.WriteAllLines(
    "Shipping2.txt", 
    _shipments.Select(
        p => string.Format(
            "{0},{1}", 
            shipment.Distance, 
            shipment.Distance)
    ),
    Encoding.ASCII);

此版本需要.NET 4.0。 File.WriteAllLines將創建文件,寫入所有行並關閉文件。 _shipments.Select(p => string.Format("{0},{1}", shipment.Distance, shipment.Distance)) _shipments_shipments _shipments.Select(p => string.Format("{0},{1}", shipment.Distance, shipment.Distance))將為_shipments每個元素返回一個包含_shipments shipment.Distance + "," + shipment.Distance的字符串shipment.Distance + "," + shipment.Distance (格式化使用string.Format )`

// Single using
using (StreamWriter writer = new StreamWriter(
                                             "Shipping2.txt", 
                                             true, // !!!
                                             Encoding.ASCII))
{
       foreach (var shipment in _shipments)
       {
           string write = (shipment.Distance + "," + shipment.Distance)
                          .ToString();
           writer.WriteLine(write);
       }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM