C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[4]: 構造体のコンストラクタの値を変更


(過去ログ 92 を表示中)

[トピック内 5 記事 (1 - 5 表示)]  << 0 >>

■54926 / inTopicNo.1)  構造体のコンストラクタの値を変更
  
□投稿者/ tecc (5回)-(2010/11/10(Wed) 09:29:19)

分類:[C#] 

構造体のコンストラクタの値を変更したい

        public struct OracleParameterSet
        {
                public string Name;
                public OracleDbType DbType;
                public int Size;
                public object BindObject;
                public OracleParameterSet(string name, System.Data.DbType dbtype, int size, object bindobject)
                {
                    this.Name = name;
                    this.DbType = ConvertDataBaseFieldType(dbtype); ←ここ
                    this.Size = size;
                    this.BindObject = bindobject;
                }
        }

この様なコードで、データベースの型推論を行いたいです。
しかし、構造体のコンストラクタで上記の様にメソッドを挟んで値を変更するのはできないようです。
どのようにしたら良いか教えて下さい。ここ読んでみ?って所でも良いので教えて下さい・・。

お願いします。

引用返信 編集キー/
■54927 / inTopicNo.2)  Re[1]: 構造体のコンストラクタの値を変更
□投稿者/ 魔界の仮面弁士 (1918回)-(2010/11/10(Wed) 10:11:54)
No54926 (tecc さん) に返信
> this.DbType = ConvertDataBaseFieldType(dbtype); //←ここ

そもそも、この構造体に ConvertDataBaseFieldType メソッドがありませんよね。

まずは構造体内に
 private static Oracle.DataAccess.Client.OracleDbType ConvertDataBaseFieldType(System.Data.DbType dbtype)
を用意する必要があるでしょう。そうすれば、コンストラクタも動作するようになります。


なお、上記を(static ではなく)インスタンスメソッドにすることもできますが、その場合には
CS0188 エラーを回避するため、this.ConvertDataBaseFieldType メソッドの呼び出し前に、
すべてのフィールドに何らかの値をセットしておく必要があります。

public OracleParameterSet(string name, System.Data.DbType dbtype, int size, object bindobject)
{
    this.Name = name;

    //ConvertDataBaseFieldType が静的メソッド(static)の場合は、
    //特に問題は発生しない。しかしそれがインスタンスメソッドの場合は、
    //下記のタイミングで呼びだすと、コンパイラ エラー CS0188 になる。
    //this.DbType = ConvertDataBaseFieldType(dbtype);

    // コンストラクタ内でインスタンスメソッドを呼び出す場合は、
    // すべてのフィールドに値を代入しておく必要がある。
    this.DbType = default(OracleDbType);
    this.Size = size;
    this.BindObject = bindobject;

    //全フィールドに値を代入した後であれば、インスタンスメソッドを利用できる。
    this.DbType = ConvertDataBaseFieldType(dbtype); 
}

引用返信 編集キー/
■54929 / inTopicNo.3)  Re[2]: 構造体のコンストラクタの値を変更
□投稿者/ 魔界の仮面弁士 (1920回)-(2010/11/10(Wed) 10:17:56)
No54927 (魔界の仮面弁士) に追記
> なお、上記を(static ではなく)インスタンスメソッドにすることもできますが、その場合には
> CS0188 エラーを回避するため、this.ConvertDataBaseFieldType メソッドの呼び出し前に、
> すべてのフィールドに何らかの値をセットしておく必要があります。

既定のコンストラクタを呼び出すのが手っ取り早いかも。

public OracleParameterSet(string name, System.Data.DbType dbtype, int size, object bindobject)
    : this()  // 引数なしコンストラクタ
{
    this.Name = name;
    this.DbType = ConvertDataBaseFieldType(dbtype);
    this.Size = size;
    this.BindObject = bindobject;
}

引用返信 編集キー/
■54930 / inTopicNo.4)  Re[3]: 構造体のコンストラクタの値を変更
□投稿者/ tecc (7回)-(2010/11/10(Wed) 10:47:55)
コンストラクタと継承

構造体はコンストラクタを宣言できますが、パラメータを受け取る必要があります。構造体に対して既定の (パラメータなしの) コンストラクタを宣言するとエラーになります。構造体メンバは初期化子を持つことができません。構造体メンバを既定値に初期化する既定のコンストラクタが常備されています。

new 演算子を使用して構造体オブジェクトを作成すると、オブジェクトが作成されて適切なコンストラクタが呼び出されます。クラスとは異なり、構造体は new 演算子を使用せずにインスタンス化できます。new を使用しなかった場合、各フィールドは未代入のままになり、すべてのフィールドが初期化されるまでオブジェクトを使用できません。

ここでしたか、ありがとうございました・・。
助かりました。
解決済み
引用返信 編集キー/
■54931 / inTopicNo.5)  Re[4]: 構造体のコンストラクタの値を変更
□投稿者/ tecc (8回)-(2010/11/10(Wed) 10:48:08)
No54930 (tecc さん) に返信
> コンストラクタと継承
>
> 構造体はコンストラクタを宣言できますが、パラメータを受け取る必要があります。構造体に対して既定の (パラメータなしの) コンストラクタを宣言するとエラーになります。構造体メンバは初期化子を持つことができません。構造体メンバを既定値に初期化する既定のコンストラクタが常備されています。
>
> new 演算子を使用して構造体オブジェクトを作成すると、オブジェクトが作成されて適切なコンストラクタが呼び出されます。クラスとは異なり、構造体は new 演算子を使用せずにインスタンス化できます。new を使用しなかった場合、各フィールドは未代入のままになり、すべてのフィールドが初期化されるまでオブジェクトを使用できません。
>
> ここでしたか、ありがとうございました・・。
> 助かりました。
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -