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

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

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

参照型のキャスト代入の動作


(過去ログ 5 を表示中)

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

■5290 / inTopicNo.1)  参照型のキャスト代入の動作
  
□投稿者/ DD. 二等兵(1回)-(2006/08/04(Fri) 09:31:45)

分類:[C#] 


分類:[C#] 

DD.と申します。

現在検証できる環境がなく、もうしわけないのですが質問をさせて頂きたいと思います。

参照型にて代入演算子を用いると左辺値と右辺値は同じオブジェクトを指すようになるかと思います。

この場合に、左辺値が右辺値の派生クラスであった時に、ダウンキャストを用いて代入を行なったとします。

この場合の動作に関して質問をさせて頂きたいのです。

@左辺値と右辺値は同じオブジェクトを指す。
Aダウンキャストの際、オブジェクトの複製がなされた派生クラスの新しいインスタンスを作成する。

C# ではどちらの動作が行なわれるのでしょうか?


0
引用返信 編集キー/
■5292 / inTopicNo.2)  Re[1]: 参照型のキャスト代入の動作
□投稿者/ επιστημη 軍曹(60回)-(2006/08/04(Fri) 11:28:40)

分類:[C#] 

No5290に返信(DD.さんの記事)
> この場合に、左辺値が右辺値の派生クラスであった時に、ダウンキャストを用いて代入を行なったとします。
> ...

class Base { public int dummyB = 1; }
class Derived : Base { public int dummyD= 2; }

class Program {
 public static void Main() {
  Base b = new Derived();
  Derived d = (Derived)b;
  if ( b == d ) System.Console.WriteLine("Identical");
 }
}

Identical だそうです。


0
引用返信 編集キー/
■5294 / inTopicNo.3)  Re[2]: 参照型のキャスト代入の動作
□投稿者/ DD. 二等兵(2回)-(2006/08/04(Fri) 12:17:04)

分類:[C#] 

DD.です。

> Base b = new Derived();
>   Derived d = (Derived)b;
>   if ( b == d ) System.Console.WriteLine("Identical");
>
> Identical だそうです。
επιστημηさん、検証ありがとうございます。

ちょっと内容は異なるのですが、別な方向で質問を続けさせて下さい。

アプリケーションドメインを作成し、そこから CreateInstance() を行なったとします。
ここから得られるインスタンスは ObjectHandle型となるため、本来の型にキャストしてやる必要があると思います。

// 例)AppDomain.CreateInstance()から得た handle を Type型にキャスト
Type type = (Type)handle.Unwrap();

この時、Typeクラス内のメンバに対し、getプロパティが呼ばれています。
#尚、Typeクラスは MarshalByRefObject を継承しているとします。

この場合には、新規に別インスタンスを生成しているのでしょうか?


0
引用返信 編集キー/
■5304 / inTopicNo.4)  Re[3]: 参照型のキャスト代入の動作
□投稿者/ DD. 二等兵(5回)-(2006/08/04(Fri) 21:44:09)

分類:[C#] 

DD.です。

検証しました。

Identicalだそうです。
う〜ん。なんか変なかんじ。


0
引用返信 編集キー/
■5310 / inTopicNo.5)  Re[4]: 参照型のキャスト代入の動作
□投稿者/ DD. 二等兵(6回)-(2006/08/05(Sat) 12:05:27)

分類:[C#] 

解決チェックつけ忘れです。


解決済み
引用返信 編集キー/
■5317 / inTopicNo.6)  Re[5]: 参照型のキャスト代入の動作
□投稿者/ 中博俊 神(630回)-(2006/08/05(Sat) 22:01:58)
中博俊 さんの Web サイト

分類:[C#] 

もちょっとちゃんとテストコードつけてちょ。
AppDomainをまたいでいるのはだれか?
AppDomainAとBで参照しているオブジェクトは等価か?

を考えればおのずと答えはわかると思います。

0
引用返信 編集キー/
■5328 / inTopicNo.7)  Re[6]: 参照型のキャスト代入の動作
□投稿者/ DD. 二等兵(7回)-(2006/08/07(Mon) 10:14:43)

分類:[C#] 

DD.です。
> もちょっとちゃんとテストコードつけてちょ。
あ、申し訳ないです。
テストコードは

namespace Marshaling {
public class Hoge : MarshalByRefObject { ... }

AppDomain domain = AppDomain.CreateDomain( "Hoge Domain" );
ObjectHandl oh = domain.CreateInstance(
"Marshaling",
"Marshaling.Hoge",
false,
System.Reflection.BindingFlags.CreateInstance,
null, new object[] { ... },
null, null, null
);
Hoge hoge1 = (Hoge)oh.Unwrap();
Hoge hoge2 = (Hoge)oh.Unwrap();
if ( hoge1 == hoge2 ) { 〜.WriteLine( "Identical" ); }
...
}

な、かんじになります。

> AppDomainをまたいでいるのはだれか?
> AppDomainAとBで参照しているオブジェクトは等価か?
ちょ、ちょっと考えます。


0
引用返信 編集キー/
■5353 / inTopicNo.8)  Re[7]: 参照型のキャスト代入の動作
□投稿者/ DD. 二等兵(8回)-(2006/08/08(Tue) 10:53:27)

分類:[C#] 

DD.です。

>AppDomainをまたいでいるのはだれか?
Hoge オブジェクトが既定のAppDomainと「Hoge Domain」AppDomainをまたいでいる。

私の疑問は、AppDomainをまたいだ場合に、
本当の参照が渡されるのか?
それとも、実はオブジェクトのコピーが作成され、
変更が加わった場合に、シリアル化されたデータが送られて
変更内容を適用することによって参照渡しのように見せているだけなのか?
というところでした。

>AppDomainAとBで参照しているオブジェクトは等価か?
先のテストコードの
Hoge hoge1 = (Hoge)oh.Unwrap();
Hoge hoge2 = (Hoge)oh.Unwrap();
if ( hoge1 == hoge2 ) { 〜.WriteLine( "Identical" ); }
から、等価であると考えます。

なので、上記疑問点は前者であると判断します。

間違い・勘違い点等があればご指摘お願いします。


0
引用返信 編集キー/
■5358 / inTopicNo.9)  Re[8]: 参照型のキャスト代入の動作
□投稿者/ 中博俊 神(632回)-(2006/08/08(Tue) 12:41:00)
中博俊 さんの Web サイト

分類:[C#] 

> >AppDomainをまたいでいるのはだれか?
> Hoge オブジェクトが既定のAppDomainと「Hoge Domain」AppDomainをまたいでいる。
> 私の疑問は、AppDomainをまたいだ場合に、
> 本当の参照が渡されるのか?
> それとも、実はオブジェクトのコピーが作成され、
> 変更が加わった場合に、シリアル化されたデータが送られて
> 変更内容を適用することによって参照渡しのように見せているだけなのか?
> というところでした。

Inside .NETでも読んでもらうのが一番かもしれませんが、原理上はオブジェクトなどはAppDomain内にしか存在しませんし、またぐことは出来ません。
実際にはシリアルかされたデータが送られていますが、ココの部分に関してはイベントシンク、プロクシクラスの動作でカバーされています。

> >AppDomainAとBで参照しているオブジェクトは等価か?
> 先のテストコードの
> Hoge hoge1 = (Hoge)oh.Unwrap();
> Hoge hoge2 = (Hoge)oh.Unwrap();
> if ( hoge1 == hoge2 ) { 〜.WriteLine( "Identical" ); }
> から、等価であると考えます。
> なので、上記疑問点は前者であると判断します。

私からの問いかけはAppDomainのこちら側のhoge1と、あちら側のhoge2と思っていましたからちょっと意味が無いのですが、このテスト条件でいくと同じプロクシオブジェクトを参照しているだけです。
デバッガでウオッチしてもらえれば
{System.Runtime.Remoting.Proxies.__TransparentProxy}
と出ていることでわかるかと思います。

あと微妙にコンパイルが通らないテストコードはめんどくさいので、再現してくれる人を遠ざけるので、出来るだけうまくやりましょう。







0
引用返信 編集キー/
■5359 / inTopicNo.10)  Re[9]: 参照型のキャスト代入の動作
□投稿者/ 中博俊 神(633回)-(2006/08/08(Tue) 12:41:43)
中博俊 さんの Web サイト

分類:[C#] 

namespace Marshaling
{
public class Hoge : MarshalByRefObject {
}
class Program
{
static void Main(string[] args)
{
AppDomain domain = AppDomain.CreateDomain("Hoge Domain");
ObjectHandle oh = domain.CreateInstance("ConsoleApplication1", "Marshaling.Hoge", false, System.Reflection.BindingFlags.CreateInstance, null, new object[0], null, null, null);
Hoge hoge1 = (Hoge)oh.Unwrap();
Hoge hoge2 = (Hoge)oh.Unwrap();
if (hoge1 == hoge2)
{
Console.WriteLine("Identical");
}
}
}
}



0
引用返信 編集キー/
■5362 / inTopicNo.11)  Re[9]: 参照型のキャスト代入の動作
□投稿者/ DD. 二等兵(9回)-(2006/08/08(Tue) 13:55:39)

分類:[C#] 

> Inside .NETでも読んでもらうのが一番かもしれませんが、原理上はオブジェクトなどはAppDomain内にしか存在しませんし、またぐことは出来ません。
> 実際にはシリアルかされたデータが送られていますが、ココの部分に関してはイベントシンク、プロクシクラスの動作でカバーされています。
実際はどちらかというと後者のほうだったのですね。ご説明ありがとうございます。
ところで Inside.NET とは書籍かなにかでしょうか?
そのままググってみてもそれらしいものが見当たらないもので。。。


> 私からの問いかけはAppDomainのこちら側のhoge1と、あちら側のhoge2と思っていましたからちょっと意味が無いのですが、このテスト条件でいくと同じプロクシオブジェクトを参照しているだけです。
> デバッガでウオッチしてもらえれば
> {System.Runtime.Remoting.Proxies.__TransparentProxy}
> と出ていることでわかるかと思います。
すいません。意味をきちんと理解していなかったですね。
ここらへんは現在勉強中でまだまだ詳細が把握できていません。
#マーシャリングやプロクシ等の動作がいまいちつかめていません。

> あと微妙にコンパイルが通らないテストコードはめんどくさいので、再現してくれる人を遠ざけるので、出来るだけうまくやりましょう。
申し訳ないです。
確かにその通りで、的確なご指摘ありがとうございます。


0
引用返信 編集キー/
■5364 / inTopicNo.12)  Re[10]: 参照型のキャスト代入の動作
□投稿者/ 中博俊 神(634回)-(2006/08/08(Tue) 15:14:35)
中博俊 さんの Web サイト

分類:[C#] 

> ところで Inside.NET とは書籍かなにかでしょうか?
> そのままググってみてもそれらしいものが見当たらないもので。。。

ごめんなさい。
http://www.cbook24.com/pubinclude/BookReview/bookreview20050609.asp
Essential .NETです

>>あと微妙にコンパイルが通らないテストコードはめんどくさいので、再現してくれる人を遠ざけるので、出来るだけうまくやりましょう。
> 申し訳ないです。
> 確かにその通りで、的確なご指摘ありがとうございます。

ま、返答があるかどうかだけの問題だし(^^;

0
引用返信 編集キー/
■5375 / inTopicNo.13)  Re[11]: 参照型のキャスト代入の動作
□投稿者/ DD. 二等兵(10回)-(2006/08/08(Tue) 21:04:26)

分類:[C#] 

> http://www.cbook24.com/pubinclude/BookReview/bookreview20050609.asp
> Essential .NETです
既にCLRにの内部動作に関して細かく説明してある書籍がでているのですね。

1つだけお尋ねしたいのですが、COMに関して理解していなくてもこの書籍を読むにあたっては問題ないのでしょうか?

#COMはよく知らない。。。


0
引用返信 編集キー/
■5377 / inTopicNo.14)  Re[12]: 参照型のキャスト代入の動作
□投稿者/ 中博俊 神(636回)-(2006/08/08(Tue) 23:32:38)
中博俊 さんの Web サイト

分類:[C#] 

COMは関係ないです。(^^

0
引用返信 編集キー/
■5379 / inTopicNo.15)  Re[13]: 参照型のキャスト代入の動作
□投稿者/ DD. 二等兵(11回)-(2006/08/09(Wed) 00:20:58)

分類:[C#] 

> COMは関係ないです。(^^
了解です。ありがとうございます。

お金と相談して、購入を検討したいと思います^^


解決済み
引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -