-2

この投稿を書いているとき、私は関連する主題で尋ねられたすべての質問をチェックしていて、このNewbs C#の問題に対する簡単な答えを見つけることができませんでした

私は...もしよければ、それがよく説明された答えになることができる限り多くを持っていることを望みます(お願いします!)

パブリック静的クラスを作成しました

        public static class MyLoadedBtmpToolBox
        {
            public static string FnameToLoad;
            public static bool PutLoadedByteArrInPicbox;
            public static string[] LoadedRefrnce;
            public static int SourceX_Loaded, SourceY_Loaded, RectWidth_Loaded, RectHeight_Loaded;

--->            public static int tst = Str2Int(LoadedRef[0]);

            public static byte[] LoadedByteArr;

        }

このcalsは、デフォルトで通常行われているように、私が使用しているメインフォーム内にあります

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;
using System.Threading;
using System.Diagnostics;
using System.Drawing.Imaging;
using System.IO;
using System.Security.Cryptography;
using WindowsInput;

namespace MyScrCupTry1
{
    public partial class MyForm1 : Form
    {

            public static class MyLoadedBtmpToolBox
            {


              public static int testStr2Int = Str2Int("100");


            }




          public int Str2Int(string STR)
          {

            int strInt = Convert.ToInt32(null);
            if (isntEmpty(STR))
            {
                strInt = Convert.ToInt32(STR);

            }
            else
            {
                MessageBox.Show("theString " + STR + " is Null");
            }
            return strInt;

     }

}

メインフォームからtestStr2Int公開されている「ヘルパーメソッド」を使用して値を評価することはできません。エラーが発生します。Str2Int()

エラー1非静的フィールド、メソッド、またはプロパティにオブジェクト参照が必要です'MyScrCupTry1.MyForm1.Str2Int(string)' G:\ RobDevI5-Raid-0 \ Documents \ Visual Studio 2010 \ Projects \ WindowsFormsApplication2 \ WindowsFormsApplication2 \ MyForm1 .cs 95 45 MyScrCuptry1

可能であれば/(違法ではない)静的クラスからメインフォームパブリック要素にアクセスするための正しい方法は何ですか...

  • 再編集

これらの2つの答えの後..。

私は期待される結果なしに最初の答えからコードを実装しようとしました私はオーバーライドOnLoad(..)のことで正しいコード構造を知らなかったと思います...

しかし !Str2Int(STR)メソッドをpublicからpublicstatic に変更しました

Str2Int() そのため、フォーム自体の要素は、静的なクラスIからもアクセスできます(驚いています)。

そして、それを静的にすることにも感謝します、

Str2Int()をパブリックからパブリックスタティックに変更するときに「隠れた」欠点がありますか?

4

2 に答える 2

1

コードのポイントはstatic、他のオブジェクトではなく、それ自体に属することです。これが真実であるためには、何かを静的に設定するとき、それに依存するすべてのものも静的でなければなりません!

これはあなたのエラーメッセージがあなたに伝えようとしていることです。何かを静的として宣言していますが、その静的の計算では、静的ではないものを使用しています。 Str2Intは静的としてタグ付けされていないため、これは当面の問題であり、LoadedRef静的ではない可能性もあります。私はあなたが実際にLoadedRefrnceそこで使うつもりだったと半信半疑です、その場合あなたは大丈夫です、しかしあなたが何も正しく綴っていないので私は確信が持てません!

staticキーワードの説明については、このページを確認してください。また、 C#のコーディング規則をよく読んでください。これにより、このようなヘルプを求めたときに、人々がコードを読みやすくなります。

上記の編集を拡張します。

コードを静的にすることの「欠点」は、コードがテスト不可能な部分であるすべてのものをほぼ瞬時に作成することです。単体テストの背後にある考え方は、すべてのコードを完全に交換可能なパーツに分割して、別々にテストし、(必要に応じて)別々に移動できるようにすることです。一連のコードを静的にすることで、基本的に、コードが含まれている可能性のある他のコードに結合することになります。あなた自身の例では、Str2Int()publicを静的にすることで、使用するすべてのものをStr2Int()テストできなくなりました。

静的コードは、一般的に言って、可能な限り回避するように努めるべき悪徳です。できない場所もあります。本当に学び始めたばかりの場合、最大の焦点は何かを機能させることです。しかし、このコードを振り返る準備をして、自分のスキルにもっと経験があり自信があるときに、数年でこれほど悪いものを書くことができた方法を冷静に考えてください。

于 2012-08-27T21:03:17.657 に答える
0

次のように、静的クラスにオブジェクトを追加Formします。

public static class MyLoadedBtmpToolBox
{
     public static Form MainForm {get;set;}

     public static int testStr2Int = MainForm.Str2Int("100");
}

とからForm

public partial class MyForm1 : Form
{
     private override OnLoad(..){

        base.OnLoad(...);    
        MyLoadedBtmpToolBox.MainForm =this;

     }
}

を呼び出すために使用されるMyFormにプロパティが初期化されることを保証する必要があるため、この設計はそれ自体が壊れやすいものです。したがって、それが公開されていることを考えると、静的クラスではなく、あなたもできることの初期化である可能性があります。..testStr2Int = MainForm.Str2Int("100")..testStr2IntForm

于 2012-08-27T21:02:16.140 に答える