C#, C♯, C#相談室 Part68

このエントリーをはてなブックマークに追加
813デフォルトの名無しさん
linqって何でこんなにも、とっつき難いんだろうー
SQL文と似ているけど、何か違う
814デフォルトの名無しさん:2011/11/27(日) 11:40:17.03
技術者のオナニーでしょw
そういうオナニーはよくあるよ

Cの構文なんかも技術者のオナニー要素あるし

変に楽しようとするとオナニー実装しちゃうことよくある
815デフォルトの名無しさん:2011/11/27(日) 11:41:56.42
>>813
単に慣れの問題だと思うんだ
普段慣れ親しんでいる物と違うから、とっつき難く感じる
816デフォルトの名無しさん:2011/11/27(日) 11:44:25.85
fromキーワードとか使ってるからだろ
Where().Select()表記なら何もわかりにくいものはない
817813:2011/11/27(日) 12:01:41.49
<root><user>
<name>name</name>
<sex>man</sex>
<passwd>passwd</passwd>
</user></root>

XElement element = XElement.Load(txtXmlFilePath.Text);
var query = from n in element.DescendantNodes("user")
select n;
<user>以下をすべて取り出したいんだけど、怒られちゃう
SQL文と違うやん
818デフォルトの名無しさん:2011/11/27(日) 12:05:41.59
XElement.Parse(Text).Desendants("user")
819813:2011/11/27(日) 12:23:00.81
>>818
とりあえず、動いた
ありがとう

from p in XXX
XXXには何でも書いてOK?
820デフォルトの名無しさん:2011/11/27(日) 13:15:30.55
まずはmsdnを調べる習慣を付けよう
821デフォルトの名無しさん:2011/11/27(日) 13:19:41.91
クエリ式は中途半端にメソッドが混じるから止めた方がいいと思うんだよねえ
中途半端に似てるせいで違いに戸惑うことの方が多いと思うんだけど
822デフォルトの名無しさん:2011/11/27(日) 13:20:50.83
>一般に、LINQ クエリを記述する場合、可能なときは常にクエリ構文を使用し、必要に応じてメソッド構文を使用することをお勧めします。
>この 2 つの形式の間に意味および動作についての違いはありません。
>クエリ式は多くの場合、メソッド構文で記述された同等の式に比べてわかりやすくなります。

こんなこと言ってるけどさ
ハァ?って感じだよね
823デフォルトの名無しさん:2011/11/27(日) 13:25:36.05
なにより遅いし。
824デフォルトの名無しさん:2011/11/27(日) 13:36:12.49
分かりやすくないし
825デフォルトの名無しさん:2011/11/27(日) 13:51:12.12
>クエリ式は多くの場合、メソッド構文で記述された同等の式に比べて誤解を招きます。

こうしよう
826デフォルトの名無しさん:2011/11/27(日) 13:54:47.34
俺は別に判り難いと思わんがなあ
慣れてないだけじゃない?
827デフォルトの名無しさん:2011/11/27(日) 13:57:46.77
多くの人は慣れるほど使わないかと
828デフォルトの名無しさん:2011/11/27(日) 14:00:20.04
ILとの直交性がないからなぁ。ふつう使わないだろ。
829デフォルトの名無しさん:2011/11/27(日) 14:07:35.61
クエリ式はfromをいっぱい並べたいときだけメソッド式より有利
830デフォルトの名無しさん:2011/11/27(日) 14:20:47.83
>>813
オラクルのPro*Cも相当ひどかったが
あれと同じにおい?
831デフォルトの名無しさん:2011/11/27(日) 14:38:26.98
最初頑張って使ってたけどメソッド式を見た瞬間に乗り換えたわ
マジで存在意義がわからん
832813:2011/11/27(日) 15:13:02.31
>>827
そうだよね〜
Enterpriseじゃ未だに.NET 2.0だから、Linq覚えれないよね
仕事で使わないと実践的な使い方とか、なかなか覚えれない

>>830
SQL ServerメインだからOracleはわからん
Oracleは最近使い始めたばかりだから、まだストアド書けるレベルにもなってないもので
833デフォルトの名無しさん:2011/11/27(日) 15:17:29.24
エンタープライズだから.NET 2.0というのは違うでしょ
自分の世界がすべてだと思わないように
834デフォルトの名無しさん:2011/11/27(日) 15:18:06.77
Pro*Cは吐かれたソースがわけわかめでわろた
835デフォルトの名無しさん:2011/11/27(日) 16:44:26.55
Pro*Cは単純なサンプルのソースすら汚い。
オラクルはバグが多いはずだ。
836デフォルトの名無しさん:2011/11/27(日) 19:06:39.29
ラムダはlinqとセットで使わないとメリットがないと思うのは俺だけ?
普段使うところない気がする
837デフォルトの名無しさん:2011/11/27(日) 19:12:28.77
今となってはdelegateの存在感が・・・
838デフォルトの名無しさん:2011/11/27(日) 19:17:57.28
>>836
お手軽な匿名関数としての利用価値がめっちゃあるじゃん
839デフォルトの名無しさん:2011/11/27(日) 19:21:08.01
ヘジたんはデモでLINQ使うときいっつもメソッド形式使ってるよね
840デフォルトの名無しさん:2011/11/27(日) 19:21:17.81
お手軽っていう理由だけだと通らない現場もある。
841デフォルトの名無しさん:2011/11/27(日) 19:33:26.83
現場ごとにあわせればいいだけの話
頭の融通が利かないのが一番悪
842デフォルトの名無しさん:2011/11/27(日) 20:22:50.87
>>836
用意されているのでもLazyやDelegateCommand
自分で使っていくにもfactory的に引数で受けるようにしたりとか
使おうとすれば幾らでも使いどころあるよ(その辺の使い方は関数型言語の考え方を見るといいかも)
843デフォルトの名無しさん:2011/11/27(日) 20:24:39.74
このスレでfactoryってよくきくけどなんなの?
そういう用語どこで覚えてるの?
844デフォルトの名無しさん:2011/11/27(日) 20:25:36.39
>>836が無名関数とラムダを区別している一方で
返答者は区別せずに回答してる件
845デフォルトの名無しさん:2011/11/27(日) 20:33:23.91
C#では () => { } と () => 式 の両方をラムダ式と呼ぶから匿名メソッドと実質的な違いはない
delegate() { } との表記の違いだけ
846デフォルトの名無しさん:2011/11/27(日) 20:49:43.47
>>843
デザインパターン本を一冊読む
847デフォルトの名無しさん:2011/11/27(日) 20:50:17.90
Expressionになるラムダを指すのなら、
LINQ以外でも式がデータとして取れるのでタイプセーフに名前を取り出したり
それとILビルダー(最後にCompileしてFuncを作る)としての役割もあるね
848デフォルトの名無しさん:2011/11/27(日) 20:53:07.66
>>847
Prismでやってたな、それ。


protected virtual void RaisePropertyChanged(string propertyName)
{
  PropertyChangedEventHandler handler = this.PropertyChanged;
  if (handler != null)
  {
    handler(this, new PropertyChangedEventArgs(propertyName));
  }
}

protected void RaisePropertyChanged<T>(Expression<Func<T>> propertyExpression)
{
  var propertyName = PropertySupport.ExtractPropertyName(propertyExpression);
  this.RaisePropertyChanged(propertyName);
}
849デフォルトの名無しさん:2011/11/27(日) 20:53:21.36
MSって基本的にクラスやメンバの名前にデザインパターンの慣用名使わないから
Javaなんかと違って知らないうちに使っててもわかりにくいんだよね
デザパタ名嫌いだからMSの方針は好みだけど
850デフォルトの名無しさん:2011/11/27(日) 20:55:55.85
Prismなんか持ち出さんでもASP.NET MVCにあるよ
851デフォルトの名無しさん:2011/11/30(水) 00:14:03.70
>>848
コードはhttp://ideone.com/とか使ってくれ
すごく読みにくい
852デフォルトの名無しさん:2011/11/30(水) 09:47:10.34
var threadSafeHandler = Interlocked.CompareExchange(ref Raised, null, null);

Livetのイベント呼び出しがこんなコードになってるけど
32bit環境なら32bitまで、64bit環境なら64bitまでの代入や取得ってアトミックだった気がするんだけど
違いました?
853デフォルトの名無しさん:2011/11/30(水) 09:53:47.17
それはCompareとExchangeをスレッドセーフで処理するメソッドじゃね?
854デフォルトの名無しさん:2011/11/30(水) 10:30:15.47
>>853
nullとの比較だと、元の値を変えずに取り出す事と同じになる。
Interlocked.Readの参照版が無いからこれで代替してるんだろう。
855デフォルトの名無しさん:2011/11/30(水) 10:39:12.04
最適化を抑制してるんだろうけど、本当に必要なのかこれ
MSのコードでそんなことやってるの見たことないし、VBのRaiseEventもそんなことしてないはず
C#の言語仕様だと、データの依存関係は必ず保持されて変数の値は順番通りに計算されるとあるが
856デフォルトの名無しさん:2011/11/30(水) 10:48:45.78
>>855
コレクションのSyncRootはComapreExchangeで生成されてるよ
857デフォルトの名無しさん:2011/11/30(水) 10:50:13.74
CompareExchangeってダブルチェックロッキングの代替だと思ってたんだけど違うの?
858デフォルトの名無しさん:2011/11/30(水) 10:59:14.81
http://blogs.msdn.com/b/cburrows/archive/2010/03/30/events-get-a-little-overhaul-in-c-4-afterward-effective-events.aspx
MSの人もこうだからやっぱりCompareExchange要らないんじゃない
C#4.0からイベントの+=や-=がロックフリーになってるけど、それで生成されるコードも
フィールドのローカル変数への代入が最適化で消えたり順番が変わったりすることは前提にないみたいだよ
859デフォルトの名無しさん:2011/11/30(水) 11:09:22.31
>>856
そりゃうっかり2つ作っちゃったら困るからな
852はreadの代わりにしてるだけ
860デフォルトの名無しさん:2011/11/30(水) 13:07:08.36
>>857
ダブルチェックロッキングみたいな、比較“代入”だけなら、問題にならないはず。
86系 CPU だと確かダブルチェックロッキング正常に動くって話だったと思うし、
.NET 2.0 以降のメモリモデルなら、volatile つければ他の環境でも動く保障つくはず。

CompareExchange は比較“交換”だから勝手違うと思う。

>>858
4.0 で lock(this) は消えたけど、代わりに CompareExchange 使ったパターンになったのよね?
あの CompareExchange は必要なんじゃないの?
861デフォルトの名無しさん:2011/11/30(水) 13:25:43.43
>>860
イベントアクセサのあれは本当にcompare−>exchangeしてる
readだけの箇所にはInterlocked使ってない
862デフォルトの名無しさん:2011/11/30(水) 13:51:05.63
>>861
そうそう、それを確認したく。
863デフォルトの名無しさん:2011/11/30(水) 14:08:24.64
じゃあ、ロックフリーな遅延初期化って
Hoge a = this.x;
if (a == null) {
 a = new Hoge();
 Interlocked.CompareExchange(ref this.x, a, null);
}
だけでいいの?
少なくともthis.x != nullなのに初期化が終わってない状態には
ならないと思うけど
864デフォルトの名無しさん:2011/11/30(水) 18:15:53.32
ちと話しぶった切るけど、、、ある文字列をゼロサプレスするのに
効率的な方法ってどんなのがあるのでしょうか?
自分は一文字ずつsubstringで取得して精査する方法しか思いつかないのですが・・・

例)
00005 => 5
AB00001 => AB1
AB0000 => 0

のようにしたいです。
865デフォルトの名無しさん:2011/11/30(水) 18:30:14.45
後ろから0検索してごにょるだけじゃないの
866デフォルトの名無しさん:2011/11/30(水) 18:33:13.91
([A-Z]*)0*([1-9][0-9]*)?
でキャプチャしたら
867デフォルトの名無しさん:2011/11/30(水) 18:45:04.04
AB0500はどうなるんだろう
AB0501とか
868デフォルトの名無しさん:2011/11/30(水) 18:54:47.30
すいません、仕様を伝えていませんでした。。。先頭のゼロサプレスのみなので
AB0500=>AB500
AB0501=>AB501
になります。
全てのゼロを削除するならstr.Replace("0","");で良かったのですが・・・
869デフォルトの名無しさん:2011/11/30(水) 19:00:34.27
なら>>866でいけるはず
870デフォルトの名無しさん:2011/11/30(水) 19:08:23.00
正規表現使うほどのものでもないような。
substring何回も使うくらいなら、stringをchar配列にして走査したほうが早いんじゃないの
871デフォルトの名無しさん:2011/11/30(水) 19:26:12.32
>>870
それだと2バイト文字が来るとどうにも・・・orz
872デフォルトの名無しさん:2011/11/30(水) 19:33:53.72
こんなんはどうだろうか・・・

var str = "ABC000111000";

var index = str.IndexOfAny(new char[] { '1','2', '3', '4', '5', '6', '7', '8', '9' });

var beforeStr = str.Substring(0, index);
var afterStr = str.Substring(index);

beforeStr = beforeStr.Replace("0","");

var result = beforeStr + afterStr;

とか・・?
873デフォルトの名無しさん:2011/11/30(水) 19:34:46.92
.NETには1バイト文字なんて存在しないぞ
874デフォルトの名無しさん:2011/11/30(水) 19:35:58.72
>>864
AB0000 => 0

なんでゼロサプレスで "AB" が消えるの?
875デフォルトの名無しさん:2011/11/30(水) 19:53:10.26
初心者弄り始まったな
相談者は正規表現で満足しておくべきだった
876デフォルトの名無しさん:2011/11/30(水) 19:53:38.99
>>874
ごめんなさい
AB0000=>AB0
ですm(_ _)m

>>処理系がShift-Jisでしていたからできなかったのかなぁ、、、
その昔うまくできなくて、2バイトだからか?って思ってあきらめてた><
ひとつためになりました♪よく考えたら.NETてunicodeだもんね・・・
877デフォルトの名無しさん:2011/11/30(水) 20:09:35.39
この件に使うかどうかは別にしても正規表現は覚えとけ
これほど学習コストが低い割に恐ろしく広く応用できる技術ってそうないんじゃないか
878デフォルトの名無しさん:2011/11/30(水) 20:10:00.11
>>875
あの正規表現は間違ってる。

AB0000 => 0
のせいで正しい正規表現自体が存在しなかったけど。

>>876
これでどうだ?
Regex.Replace(input,"(?<![0-9])0+(?=[0-9])","")
879デフォルトの名無しさん:2011/11/30(水) 20:21:54.73
>>876
ふらっといけよ、お前みたいな初心者が来るとネタですらないどうでもいい内容のレスが増えて迷惑
880デフォルトの名無しさん:2011/11/30(水) 20:40:27.97
>>879
ほんと、どうでもよくて意味がないよな。
881デフォルトの名無しさん:2011/11/30(水) 20:55:38.62
まるで糞仕様を発注してきて何度も確認したのに
その通りに作るとクレーム入れてくる糞カスタマーみたいだな
882デフォルトの名無しさん:2011/11/30(水) 20:57:01.42
> それだと2バイト文字が来るとどうにも・・・orz
どうでもいいどころかこういうノイズを撒き散らして脳にダメージを与えてくるからたちが悪い
883デフォルトの名無しさん:2011/11/30(水) 20:57:58.45
IPさらしながら書けよ雑魚
884デフォルトの名無しさん:2011/11/30(水) 20:59:49.34
>>883
こういう糞みたいなカス煽りも出てくるしな
885883:2011/11/30(水) 21:01:26.87
だからお前みたいな基地外はこて半つけるか
IPさらせって
ばればれの自演してんじゃねーよボケ
886HRDfa-01p6-100.ppp11.odn.ad.jp:2011/11/30(水) 21:02:30.26
それで?
887デフォルトの名無しさん:2011/11/30(水) 21:02:57.72
この板をIDなしにしたやつは賢明だよな
888デフォルトの名無しさん:2011/11/30(水) 21:03:27.92
>>886
しばらく待て
889876:2011/11/30(水) 21:06:37.16
すいませんでした。ここで質問したのは場違いだったみたいです。
スレが荒れる原因になってごめんなさい。
初心者スレのほうに移ります。
890デフォルトの名無しさん:2011/11/30(水) 21:08:00.94
ほら、お前らが苛めるから泣いちゃったじゃねーか
891デフォルトの名無しさん:2011/11/30(水) 21:16:01.44
Twitterか海外に行こうぜ
892デフォルトの名無しさん:2011/11/30(水) 21:30:59.03
ID在ったほうがいいと思うんだけどなぁ
893デフォルトの名無しさん:2011/11/30(水) 21:34:47.24
LINQ厨が大反対するだろうな。
894デフォルトの名無しさん:2011/11/30(水) 22:40:40.10
ふらっとはさらっと
ここはどろっとしている。
895デフォルトの名無しさん:2011/11/30(水) 22:47:04.09
Twitter氏と海外フォーラム殿と例外と100倍が荒れ狂うんじゃねえの
896デフォルトの名無しさん:2011/11/30(水) 22:52:59.38
>>895 ←このスレの主? 書き込んでる単語の意味が全然分からないんだけど・・・。いつもここで荒らしてるしひと?
897デフォルトの名無しさん:2011/11/30(水) 22:53:44.34
そいつキチガイだから触れちゃダメ。
898デフォルトの名無しさん:2011/11/30(水) 22:55:42.02
主って何だよどこかの厨房ですか
899デフォルトの名無しさん:2011/11/30(水) 22:56:28.06
「ぬし」だろ
「しゅ」と読んだお前こそ
900デフォルトの名無しさん:2011/11/30(水) 22:58:59.22
今日スカンク頭のジジイに「アルジを呼べ!」ってゆあれた
901デフォルトの名無しさん:2011/11/30(水) 23:03:56.20
Twitterと海外がいたのはふらっとスレとWPFスレだぞ
ここには来てない
902デフォルトの名無しさん:2011/11/30(水) 23:05:34.96
>>898
ニコ厨がこんなスレに何の用なん?
903デフォルトの名無しさん:2011/11/30(水) 23:24:29.06
System.Linq.Expressionでthisを参照する方法はありますか?
904デフォルトの名無しさん:2011/11/30(水) 23:43:28.35
書きたいExpressionをラムダ式で表現してみてくれ
905デフォルトの名無しさん:2011/12/01(木) 01:12:50.83
Λ人入λ
906デフォルトの名無しさん:2011/12/01(木) 04:51:42.80
ダーリン、浮気は許さないっちゃ
907デフォルトの名無しさん:2011/12/01(木) 08:58:12.72
一人、なんでもあだ名つけて通ぶってる馬鹿ってなんなの?
908デフォルトの名無しさん:2011/12/01(木) 09:45:09.65
そいつキチガイだから触れちゃダメ。
909デフォルトの名無しさん:2011/12/01(木) 11:21:42.62
そうだ俺に触るな、欝は伝染するぞ
910デフォルトの名無しさん:2011/12/01(木) 19:56:48.55
駄目って言われてもやるのが馬鹿の馬鹿たる所以
911デフォルトの名無しさん:2011/12/01(木) 23:15:02.61
IPさらせって言ってんだろバカ
912デフォルトの名無しさん:2011/12/01(木) 23:27:15.56
研修1ヶ月、実務に入って3ヵ月になる新人です。
入門書的なテキストじゃ少し物足りないってレベルなのですが
オススメの参考書とかあったら教えてください。
913デフォルトの名無しさん:2011/12/01(木) 23:46:08.93
>>912
プログラミング.NET Framework第3版
914デフォルトの名無しさん:2011/12/02(金) 09:05:27.85
>>913
これは良書、買い
915デフォルトの名無しさん:2011/12/02(金) 09:13:13.50
お断りします。
916デフォルトの名無しさん:2011/12/02(金) 09:18:55.44
『.NETのクラスライブラリ設計 』の糞訳の人じゃん。
917デフォルトの名無しさん:2011/12/02(金) 09:40:23.17
>>912
「VisualC#実践講座」
918デフォルトの名無しさん:2011/12/02(金) 10:19:42.69
C言語のK&Rだって糞訳だけど、買わなきゃいけない本なんだよ!
919デフォルトの名無しさん:2011/12/02(金) 10:53:32.57
本当の糞訳ってのはプログラミング言語C++第三版だろ。
920デフォルトの名無しさん:2011/12/02(金) 11:01:03.56
ここで誰も「原本を買え」っていう奴がいなくて安心した
921デフォルトの名無しさん:2011/12/02(金) 11:26:02.73
原本??
922デフォルトの名無しさん:2011/12/02(金) 11:27:02.50
機械翻訳とコピペだけで内容を確認せず仕上げる糞訳者は晒さないとな。
923デフォルトの名無しさん:2011/12/02(金) 11:52:37.08
いつもコピーしている奴は原本なんて言っちゃうんだろうなw
924デフォルトの名無しさん:2011/12/02(金) 12:16:35.37
>>923 >>921
自炊はしてみたいとは思うがやってない…

翻訳する元の本を原本っていわないか?
たとえば>>918だったらhttp://amzn.com/0131103628 とか
925デフォルトの名無しさん:2011/12/02(金) 12:48:14.20
>>919
それ買ってあまりの糞訳に絶望して本屋に返品しに行ったわ
すっげええ嫌な顔されたけどあれはもはや日本語じゃなかった
926デフォルトの名無しさん:2011/12/02(金) 12:52:04.03
原著だろ。
927デフォルトの名無しさん:2011/12/02(金) 13:26:35.88
翻訳前の本を原本というみたいだけど
普通は複写に対してオリジナルを原本,翻訳される本を原著というのが一般的かと思う。
928デフォルトの名無しさん:2011/12/02(金) 14:24:25.15
Richter本はなんで訳者を駄目な人に変えちゃったんだろうな...

MS Pressは良書ほど糞訳が付きやすいような気がする
豊田孝とか読んでてイライラしますねん
929デフォルトの名無しさん:2011/12/02(金) 21:23:34.00
>>928
前の人はもう.NETとは関わってないみたいだからしょうがないのかもねえ
930デフォルトの名無しさん:2011/12/03(土) 13:14:33.19
コンボボックスに選択肢にないものを文字入力した場合、SelectedItemの値がnullになるんですけど、どうしたら自分で入力していた値を取得できますか?
931デフォルトの名無しさん:2011/12/03(土) 13:21:55.46
.Text
選択されてないんだからnullじゃないと
932デフォルトの名無しさん:2011/12/03(土) 13:26:42.38
まぁ、ワシのティンコはヌルヌルですけどね
933デフォルトの名無しさん:2011/12/03(土) 13:27:25.79
そんなことどでもいいがな゚.+:。(ノ^∇^)ノ゚.+:。
934デフォルトの名無しさん:2011/12/03(土) 13:31:12.93
>>932
しね。
935デフォルトの名無しさん:2011/12/03(土) 13:33:22.93
ありがとうございました。
936デフォルトの名無しさん:2011/12/03(土) 13:50:13.47
SelectedItemとは何だったのか
937デフォルトの名無しさん:2011/12/03(土) 14:40:00.99
.Textだけだと、選択肢から選んだのか手で打ったのかわかんねーじゃん。
938デフォルトの名無しさん:2011/12/03(土) 15:04:48.69
.NEXT
939デフォルトの名無しさん:2011/12/03(土) 16:13:20.26
>>852
ttp://www.codeproject.com/KB/cs/WeakEvents.aspx

これによると、ただの代入だとローカル変数が最適化で消される可能性があるから
確実にローカル変数に格納するという意味でCompareExchange使ってるみたいね。
でもMSの実装なら必要ないみたいだけど。
940デフォルトの名無しさん:2011/12/04(日) 10:08:37.20
言語仕様に、フィールドのローカル変数への代入は最適化で消えないと明記すればいいのにな
完全に公然の了解になっていて、今さら852程度の小細工でどうなるもんでもない
もしかして見落としてるだけ?
941デフォルトの名無しさん:2011/12/05(月) 10:14:58.23
942デフォルトの名無しさん:2011/12/07(水) 21:33:32.56
カスタムコントロール内の独自のクラス型のプロパティに関する質問です。

C#でカスタムコントロールを作っています。
自分で定義したクラス型のプロパティを作成し、
そのクラス用の TypeConverter を作成して
そのクラス型に TypeConverter 属性を指定もしました。
こんなイメージです

[TypeConverter(typeof(AConverter))]
class A { ... }
class AConverter : ExpandableObjectConverter { ... }

class BControl
{
これでデザイナで独自クラス型でもプロパティ
943デフォルトの名無しさん:2011/12/07(水) 21:37:29.11
途中で送信してしまいました・・・。

カスタムコントロール内の独自のクラス型のプロパティに関する質問です。

C#でカスタムコントロールを作っています。
自分で定義したクラス型のプロパティを作成し、
そのクラス用の TypeConverter を作成して
そのクラス型に TypeConverter 属性を指定もしました。
こんなイメージです

[TypeConverter(typeof(AConverter))] class A { ... }
class AConverter : ExpandableObjectConverter { ... }
class BControl : UserControl { A Hoge { get; set; } ... }

これでデザイナで Hoge プロパティに値が表示され、
一見その値も変更できるようにも見えるのですが、
変更が *.Designer.cs には反映されず、
デザイナを閉じてもう一度開くと初期値が表示されてしまいます。
値の変更が永続的に反映されるようにするにはどのようにすれば良いのでしょうか?

環境は VS2008 SP1 です。
944デフォルトの名無しさん:2011/12/07(水) 21:58:52.27
聞きたいことを先ず最初に書かないとだめよ?
だらだら読ませて、興味を無くした人に、最後に質問ですって
そら、答える人は奇特な人しか居らんわ。
945デフォルトの名無しさん:2011/12/07(水) 22:01:29.96
うるせー馬鹿
946デフォルトの名無しさん:2011/12/07(水) 22:01:35.55
>>943
Hogeプロパティに[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]を付ける
947デフォルトの名無しさん:2011/12/07(水) 22:33:25.27
>>946
できました!
これで胃の痛みからも解消されます
ありがとうございました
948デフォルトの名無しさん:2011/12/07(水) 22:55:55.38
もう少しで危篤な人になるところだったのか・・・
949デフォルトの名無しさん:2011/12/07(水) 22:56:58.46
どんだけ苦しんでるんだよ・・・。
950デフォルトの名無しさん:2011/12/07(水) 23:04:28.05
と思ったら、setter のあるプロパティしか反映されないー
AConverter を使ってくれないのですね・・・
951デフォルトの名無しさん:2011/12/07(水) 23:10:19.66
A の中の setter のあるプロパティしか反映されない・・・ということです
Hoge にはもちろん setter はあります
952デフォルトの名無しさん:2011/12/07(水) 23:13:09.68
int型の計算でi = i + 1というのはC#だとどう書けばいいですか?
953デフォルトの名無しさん:2011/12/07(水) 23:14:28.71
i++;
++i;
i+=1;
954デフォルトの名無しさん:2011/12/07(水) 23:24:00.65
ありがとん
955デフォルトの名無しさん:2011/12/07(水) 23:33:13.30
構造体の中のstring配列に文字列を代入したいのですが
構造体の宣言部に数を定義していないのですが string names[] ←こんな感じ
この中に代入するにはどうすれば良いですか?
最大値の分からない繰り返しの中で
hogehoge.names[i] = "hoge"のように代入したいです
956デフォルトの名無しさん:2011/12/07(水) 23:35:48.09
>>955
配列じゃなくList<T>じゃダメなの?
957デフォルトの名無しさん:2011/12/07(水) 23:40:48.62
それ初めて見ました
ちょっと調べてみます。ありがとう
958943,947,950-951:2011/12/07(水) 23:57:46.11
AにSerializable属性を付けて
AConverterにInstanceDescriptorへのCanConvertTo, ConvertToを実装する事で
何とかデザイナでの変更を永続的に反映させる事ができるようになりました

ただ、このBControlを含むプロジェクトをビルドすると、
Hoge プロパティの値を変更しようとしても
「プロパティ 'Hoge' のコード生成に失敗しました。エラー: 'AConverter' は '***.A' から
 System.ComponentModel.Design.Serialization.InstanceDescriptor' に変換できません」
というエラーが出てしまいます。
VSを再起動すればその後1回だけは出なくなりますが、
次からまたエラーが出るようになります。
AConverterの名前を変更するとVSを再起動するまでは出なくなるようですが、
VSを再起動するとまた2度目からエラーが出るようになります。
どうにかならないものでしょうか・・・。
959958:2011/12/08(木) 00:54:33.91
ダンプコードを入れてみると、
やはりビルドしてもAやAConverterが昔のままのようですね
新しくできたアセンブリと齟齬を起こして
(新しい)Aから(昔の)Aへのキャストに失敗してエラーになるようです
BControlは新しくなるのになんでこんな中途半端な実装なんだろう・・・
960デフォルトの名無しさん:2011/12/08(木) 01:02:49.71
>>958
なんか名前がすごいことになったなw
つか、なんでこのスレってID表示されないん? いっつもすげー不便だと思うんだけど。
過疎スレなんだからID生成程度のリソースをけちらないでくれ
961959:2011/12/08(木) 01:42:04.39
ConvertToの第3引数(変換元のAの値)を
無理矢理Aにキャストするとエラーが詳しく出てくるようになりました
やはり使用するアセンブリが異なるようです
アセンブリのフルパスが表示されていましたが、
...\ProjectAssembly\????????\********.exe の ? の部分が異なっていました。
(? はテンポラリディレクトリ名っぽいランダムな名前)

プロパティの値を入力する分には問題がないようですが、
いざ保存するとなるとこのエラーになるようです。
プロパティの値を入力する時のアセンブリは新しいアセンブリが使われますが、
保存するときは古いアセンブリが使われてしまうようです。(なんじゃそりゃ)

悔しいので、型チェックは Type の比較でなく FullName の比較にして、
ConvertToの第3引数からリフレクションを使ってInstanceDescriptorを作ってやる事で
なんとかする事はできました。
ただ、Aのコンストラクタが変化した場合には、AConverterのコードを変更した後、
やはりVSを再起動する必要があるようです。

まあ苦肉の策には違いないので、古いアセンブリを見なくする方法があれば
引き続きお教えいただければと思います。
962デフォルトの名無しさん
>>960
ID表示すると喧嘩になるじゃん