三月 15

有的時候我們在寫程式時,可能在Debug,會需要使用某一段程式。

而這段程式在Release時,我們又不需要了。

比較傳統的作法就是使用人工去把該程式給註解或反註解來完成。

現在我們可以使用前置處理器指示詞來達成,

「前置處理器指示詞」用比較白話的方式來講,就是程式中的程式。

繼續閱讀… »





九月 19

SHA加密有很多種版本,像是SHA1、SHA256….等

下面用一個Function來實作.NET中所有的SHA加密

using System;
using System.Security.Cryptography;
using System.Text;

namespace SystemAPI.Function.EncryptLibrary
{
    public class EncryptSHA
    {
        /// <summary>
        /// 使用SHA加密訊息
        /// </summary>
        /// <param name="sourceMessage">原始資訊</param>
        /// <param name="SHAType">SHA加密方式</param>
        /// <returns>string</returns>
        public string Encrypt(string sourceMessage, EnumSHAType SHAType)
        {
            if (string.IsNullOrEmpty(sourceMessage))
            {
                return string.Empty;
            }

            //字串先轉成byte[]
            byte[] Message = Encoding.Unicode.GetBytes(sourceMessage);
            HashAlgorithm HashImplement = null;

            //選擇要使用的SHA加密方式
            switch (SHAType)
            {
                case  EnumSHAType.SHA1:
                    HashImplement = new SHA1Managed();
                    break;
                case EnumSHAType.SHA256:
                    HashImplement = new SHA256Managed();
                    break;
                case EnumSHAType.SHA384:
                    HashImplement = new SHA384Managed();
                    break;
                case EnumSHAType.SHA512:
                    HashImplement = new SHA512Managed();
                    break;
            }

            //取Hash值
            byte[] HashValue = HashImplement.ComputeHash(Message);

            //把byte[]轉成string後,再回傳
            return BitConverter.ToString(HashValue).Replace("-","").ToLower();

        }

        public enum EnumSHAType
        {
            SHA1,
            SHA256,
            SHA384,
            SHA512
        }

    }
}

.
使用方式如下:

EncryptSHA SHA = new EncryptSHA();
string EncryptString = SHA.Encrypt("12345", EncryptSHA.EnumSHAType.SHA512);




二月 21

繼承建構子(Constructor),這看起來既有學問又深奧的文字

不要怕,以下我用白話文解釋一下

把繼承建構子分解後,就是 繼承 + 建構子

繼承,相信有物件導向概念的朋友應該都知道這2個字的意思

建構子(Constructor),就是用來進行物件初始化的方法

一般來說,Class B 繼承 Class A 之後就可以使用Class A所開放出來的東西

那麼如果Class B 繼承 Class A後,想要對Class A進行初始化的動作,那就需要使用繼承建構子了

先來看看程式吧,看程式就比較不會那麼文謅謅了。程式碼可於這邊下載(C#、VB.NET雙版本)

首先有一個最基本的Class,我們叫它Class A

C#版本Class A

class ClassA
{
    public ClassA()
    {
        _InitString = "123";
    }

    public ClassA(string initStr)
    {
        _InitString = initStr;
    }

    private string _InitString;
    public string InitString
    {
        get { return _InitString; }
    }

    public void ShowClassAInit()
    {
        Console.WriteLine(InitString);
        Console.WriteLine("-----------------------------");
    }
}

VB.NET版本Class A

Class ClassA
    Public Sub New()
        _InitString = "123"
    End Sub

    Public Sub New(ByVal initStr As String)
        _InitString = initStr
    End Sub

    Private _InitString As String
    Public ReadOnly Property InitString() As String
        Get
            Return _InitString
        End Get
    End Property

    Public Sub ShowClassAInit()
        Console.WriteLine(InitString)
        Console.WriteLine("-----------------------------")
    End Sub
End Class

接下來我們需要Class B來繼承Class A

注意到了嗎,繼承建構子的實作方式就是於Class B加入一個與Class A一樣的初始建構子

並使用base(C#語法)、MyBase.New(VB.NET語法)把初始值帶入Class A。成功於Class B內,進行初始化Class A的動作

C#版本Class B

class ClassB : ClassA
{
    public ClassB()
    {
    }

    public ClassB(string initStr)
        : base(initStr)
    {
    }
}

VB.NET版本Class B

Class ClassB
    Inherits ClassA

    Public Sub New()
    End Sub

    Public Sub New(ByVal initStr As String)
        MyBase.New(initStr)
    End Sub

End Class

接下來就看看怎麼使用,跟使用的結果吧
下面使用Console來DemoC#版本Console


class Program
{
    static void Main(string[] args)
    {
        ClassA CA1 = new ClassA();
        Console.WriteLine("new ClassA()");
        CA1.ShowClassAInit(); //Result:123

        ClassA CA2 = new ClassA("Init AAA");
        Console.WriteLine("new ClassA(\"Init AAA\")");
        CA2.ShowClassAInit(); //Result:Init AAA

        ClassB CB1 = new ClassB();
        Console.WriteLine("new ClassB()");
        CB1.ShowClassAInit(); //Result:123

        ClassB CB2 = new ClassB("Init BBB");
        Console.WriteLine("new ClassB(\"Init BBB\")");
        CB2.ShowClassAInit(); //Result:Init BBB

        Console.ReadLine();
    }
}

VB.NET版本Console


Module Module1

    Sub Main()
        Dim CA1 As New ClassA()
        Console.WriteLine("new ClassA()")
        CA1.ShowClassAInit()  'Result:123

        Dim CA2 As New ClassA("Init AAA")
        Console.WriteLine("new ClassA(""Init AAA"")")
        CA2.ShowClassAInit()  'Result:Init AAA

        Dim CB1 As New ClassB
        Console.WriteLine("new ClassB()")
        CB1.ShowClassAInit()  'Result:123

        Dim CB2 As New ClassB("Init BBB")
        Console.WriteLine("new ClassB(""Init BBB"")")
        CB2.ShowClassAInit()  'Result:Init BBB

        Console.ReadLine()

    End Sub

End Module

執行結果如下圖
20110221_1

以上程式碼可於這邊下載(C#、VB.NET雙版本)





十一月 24

有寫過C#的朋友大概都知道,要在C#中輸入一段有斷行的字串或SQL時

都會使用「@」這個好用的符號。好處就是可以直接斷行

例如:
string test = @"
select * from tb
where c1 = 123″

但是在VB.NET就要很鱉腳用 「 & _ 」來斷行
例如:
dim test as string
test = “select * from tb" & _
“where c1 = 123″

如果行數一多,那可真是累死人不償命又無聊的工程
某天在黑暗執行緒的某一篇文章挖到了寶

使用VB.NET 2008內建的XML嵌入語法,來達成模擬C#的「@」
直接看下面的例子

        Dim JS As String = <s><![CDATA[
                <script type="text/javascript">
                jQuery(function ($) {
                    $('#@txtbox.ClientID@').datepicker({
                    rangeSelect: true,
                    firstDay: 1,
                    changeMonth: true,
                    changeYear: true,
                    showOn: 'both',
                    buttonImageOnly: true,
                    buttonImage: '@Context.Request.ApplicationPath@/Picture/calendar.gif'
                    });
                });
                </script>
        ]]></s>.Value.Replace(vbLf, vbCrLf)

跟據Ark網友的補充,由於預設的換行是vbLf,所以後面我加了Replace(vbLf, vbCrLf)
來把換行符號變成vbCrLf

那如果字串裡面有變數怎麼辦?
先把變數用@包起來,例如:@txtbox.ClientID@
之後再用Replace去把變數塞進去,例如:JS = JS.Replace(“@txtbox.ClientID@", “AAAA")

看來一切都很完美了,不過還沒結束
當你在VS2010上使用時你會發現字串內的文字是接近白色的
這對老人家的眼力是很大的考驗
20101124_1

這時候可以進去選項裡面調整

20101124_2

選擇字型與色形,再挑選VB XML CData 區段,調整你想要顏色,按下確定

20101124_3

收工

20101124_4





十一月 09

如果你有寫公用程式讓使用者使用,也許經過版本的更新
有些方法、函式已經過時或過期了
你不再建議使用者繼續使用,而是改用新的方法
這時候要怎麼提示使用者呢?

答案就是使用 Obsolete 這個屬性
先來看看範例程式碼

VB.NET 的語法如下

    Partial Public Class GetDirectoryFiles
        ''' <summary>
        ''' 取得資料夾與檔案
        ''' </summary>
        ''' <returns>String</returns>
        ''' <remarks></remarks>
        <Obsolete("這個方法已經過時了,建議使用新的方法GetDF()")> _
        Public Function GetDirectoryFile() As String
            Return ""
        End Function
    End Class

C# 的語法如下

public partial class GetDirectoryFiles
{
	/// <summary>
	/// 取得資料夾與檔案
	/// </summary>
	/// <returns>String</returns>
	/// <remarks></remarks>
	[Obsolete("這個方法已經過時了,建議使用新的方法GetDF()")]
	public string GetDirectoryFile()
	{
		return "";
	}
}

當使用者使用到這個方法、函式就會出現下面的提示
提示使用者需要注意一下
20101109_1





四月 29

在 PHP 上有個 Crypt 函式是用來加密字串的

很多都用的到,例如:LDAP 上的密碼加密

那麼要如何在 .net 上實現這個函式呢

其實已經有人寫好,等我們去用了

A C# implementation of Unix crypt()

把原始檔案下載下來後是個 C# 的程式檔

先在 Visual Studio 中開一個新類別庫專案(C#),把檔案加入

然後就可以建成 dll 檔來使用了

本來有想說改成 VB.Net 的版本,不過轉換過後有些地方怪怪的就放棄了

這邊有打包好的版本,有興趣的可以下載回去研究