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

art*_* es 0 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
  }

}
Run Code Online (Sandbox Code Playgroud)

然后我尝试使用上面代码中的类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)

            { }

        }

    }
Run Code Online (Sandbox Code Playgroud)

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

CheckTexture Scan = new CheckTexture();
Run Code Online (Sandbox Code Playgroud)

如果有可能,有人请求我告诉我我的错误是什么.谢谢你的帮助

Chr*_*ton 7

这堂课不公开.将其更改为:

public class CheckTexture
{   
    Thread Search;
    public CheckTexture()
    {
        Search = new Thread(Scan);
        Search.Start();
    } 
Run Code Online (Sandbox Code Playgroud)

  • 请注意,构造函数也受到保护.可能只需更改类上的访问器即可解决. (5认同)

Son*_*nül 5

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

所以你的CheckTexture班级是internal.把它改成public喜欢;

public class CheckTexture
{
 ...   
}
Run Code Online (Sandbox Code Playgroud)

Access Modifiers (C# Programming Guide)

直接在命名空间内声明的类和结构(换句话说,不嵌套在其他类或结构中)可以是公共的或内部的.如果未指定访问修饰符,则Internal是默认值.

但这还不够.因为当你写作;

CheckTexture Scan = new CheckTexture();
Run Code Online (Sandbox Code Playgroud)

这将调用CheckTexture其访问修饰符所在的类的无参数构造函数protected.做它public也.

public CheckTexture()
{
    Search = new Thread(Scan);
    Search.Start();
}
Run Code Online (Sandbox Code Playgroud)