由于其保护级别,构造函数无法访问

时间:2013-06-08 19:54:58

标签: c# access-modifiers

我的错误是:

  

错误1'aCI.CheckTexture.CheckTexture()'由于其无法访问   保护水平

我使用此代码检查一些文件MD5 / Hash:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;

namespace aCI
{
class CheckTexture
{   
    Thread Search;
    protected CheckTexture()
    {
        Search = new Thread(Scan);
        Search.Start();
    }

    protected void Scan()
    {
        if (GetMD5Hash("1.rar") != "9647997C556C5A37A63EFAFBCA4A40D0"
           || GetMD5Hash("2.rar") != "6626959A9099B4C6F5C755E0D2E57EF8"
           || GetMD5Hash("3.rar") != "4D6611A825F81024E0153E2753B8A27E")
        {
            System.Windows.Forms.MessageBox.Show(
            "Sorry come back and restor your orginal files.",
            "Error",
            System.Windows.Forms.MessageBoxButtons.OK,
            System.Windows.Forms.MessageBoxIcon.Error);
            return;
        }
    }

    #region Hash Calculator

    private static byte[] ConvertStringToByteArray(string data)
    {
        return (new System.Text.UnicodeEncoding()).GetBytes(data);
    }

    private static System.IO.FileStream GetFileStream(string pathName)
    {
        return (new System.IO.FileStream(pathName, System.IO.FileMode.Open,
             System.IO.FileAccess.Read, System.IO.FileShare.ReadWrite));
    }

    public static string GetSHA1Hash(string pathName)
    {
        string strResult = "";
        string strHashData = "";

        byte[] arrbytHashValue;
        System.IO.FileStream oFileStream = null;

        System.Security.Cryptography.SHA1CryptoServiceProvider oSHA1Hasher =
              new System.Security.Cryptography.SHA1CryptoServiceProvider();

        try
        {
            oFileStream = GetFileStream(pathName);
            arrbytHashValue = oSHA1Hasher.ComputeHash(oFileStream);
            oFileStream.Close();

            strHashData = System.BitConverter.ToString(arrbytHashValue);
            strHashData = strHashData.Replace("-", "");
            strResult = strHashData;
        }
        catch (System.Exception ex)
        {
            System.Windows.Forms.MessageBox.Show(ex.Message, "Error!",
              System.Windows.Forms.MessageBoxButtons.OK,
              System.Windows.Forms.MessageBoxIcon.Error,
              System.Windows.Forms.MessageBoxDefaultButton.Button1);
        }

        return (strResult);
    }

    public static string GetMD5Hash(string pathName)
    {
        string strResult = "";
        string strHashData = "";

        byte[] arrbytHashValue;
        System.IO.FileStream oFileStream = null;

        System.Security.Cryptography.MD5CryptoServiceProvider oMD5Hasher =
              new System.Security.Cryptography.MD5CryptoServiceProvider();

        try
        {
            oFileStream = GetFileStream(pathName);
            arrbytHashValue = oMD5Hasher.ComputeHash(oFileStream);
            oFileStream.Close();

            strHashData = System.BitConverter.ToString(arrbytHashValue);
            strHashData = strHashData.Replace("-", "");
            strResult = strHashData;
        }
        catch (System.Exception ex)
        {
            System.Windows.Forms.MessageBox.Show(ex.Message, "Error!",
           System.Windows.Forms.MessageBoxButtons.OK,
           System.Windows.Forms.MessageBoxIcon.Error,
           System.Windows.Forms.MessageBoxDefaultButton.Button1);
        }

        return (strResult);
    }
    #endregion
  }

}

然后我尝试使用上面代码中的类CheckTexture:

 private void BtnMpLanClick(object sender, RoutedEventArgs e)
    {
        if (!File.Exists("chrome.exe"))
        {
            MessageBox.Show("Cannot find chrome.exe");
            return;
        }

        else
        {
            //Process.Start("chrome.exe");
            this.StartTheProcess("chrome.exe", "");

            Thread.Sleep(10);

            try
            {
                // I have error on this line:

                CheckTexture Scan = new CheckTexture();

            }
            catch (Exception)

            { }

        }

    }

但我在这一行上有这个错误:

CheckTexture Scan = new CheckTexture();

如果有可能请某人打电话给我,这是我的错误。 谢谢你的帮助

3 个答案:

答案 0 :(得分:7)

班级不公开。将其更改为:

public class CheckTexture
{   
    Thread Search;
    public CheckTexture()
    {
        Search = new Thread(Scan);
        Search.Start();
    } 

答案 1 :(得分:5)

在C#中,类的默认访问修饰符为internal

因此,您的CheckTexture课程为internal。将其更改为public喜欢;

public class CheckTexture
{
 ...   
}

来自Access Modifiers (C# Programming Guide)

  

直接在命名空间内声明的类和结构(in   换句话说,没有嵌套在其他类或结构中)可以   是公共的还是内部的。 如果没有访问权限,则内部是默认设置   指定了修饰符。

但这还不够。因为你写的时候;

CheckTexture Scan = new CheckTexture();

这将调用CheckTexture类的无参数构造函数,其访问修饰符为protected。也可以public

public CheckTexture()
{
    Search = new Thread(Scan);
    Search.Start();
}

答案 2 :(得分:2)

默认情况下,C#中的类是internal。标记public。根据@Caramiriel注释,构造函数也需要标记为public