ふらっと C#,C♯,C#(初心者用) Part135
■ このスレッドは過去ログ倉庫に格納されています
「どんなにくだらないC#プログラミングやVisual C#の使い方に関する質問でも誰かが優しくレスをしてくれるスレッド」です。
他のスレッドでは書き込めないような低レベルな質問、
質問者自身なんだか意味がよく分からない質問、
ググろうにもキーワードが分からないなど、勇気をもって書き込んでください。
内容に応じて他スレ・他板へ行くことを勧められることがあります。ご了承下さい。
なお、テンプレが読めない回答者、議論をしたいだけの人は邪魔なので後述のC#相談室に移動して下さい。
C#に関係の無い話題や荒らしの相手や罵倒レスはやめてください
>>980を踏んだ人は新スレを建てて下さい。
>>980が無理な場合、話し合って新スレを建てる人を決めて下さい。
■前スレ
ふらっと C#,C♯,C#(初心者用) Part134
http://mevius.5ch.net/test/read.cgi/tech/1511951038/
■関連スレ
C#, C♯, C#相談室 Part95
http://mevius.5ch.net/test/read.cgi/tech/1508180530/
C#, C♯, C#相談室 Part93
https://mevius.5ch.net/test/read.cgi/tech/1492818720/
■コードを貼る場合は↓を使いましょう。
http://ideone.com/
https://dotnetfiddle.net/
■情報源
https://msdn.microsoft.com/ja-jp/library/gg145045.aspx
https://docs.microsoft.com/ja-jp/dotnet/csharp/language-reference/index
https://msdn.microsoft.com/en-us/library/gg145045.aspx
http://referencesource.microsoft.com/
VIPQ2_EXTDAT: default:vvvvv:1000:512:----: EXT was configured //パラメータをシングルトンで持たせたいのだが、Jsonで格納しようとするとstaticにできない。なので
referenceを返したいのだが、何かいい方法はない?
class Singleton
{
private Singleton(){}
public static Singleton getInstace() {
return SingletonHolder.INSTANCE;
}
private static class SingletonHolder {
public static Singleton INSTANCE = new Singleton();
}
}
たとえば教科書にあるシングルトン。これに
class clsGrovalParam
{
public int value1;
public int value2;
public int value3;
}
public clsGrovalParam Param;
とやってParamを追加していたが、なんか動作がおかしい。W
と思ったらPublicにしていたので直接Paramを生成していてシングルトンになってなかった。
.Param
こいつをStaticにできればいいのだが、Jsonで格納するときにスタティックにすると格納できない。 また伝わらない書き方だなあ
Jsonとはなんなのか?stringなのか?typeだとしてどのJsonなのか? >>283
そのレベルのことは一通り基礎を終えれば分かるから、今はソースに直にstaticで書いとけ
言っちゃ悪いけど、まだ設定の外部化なんか考えるようなレベルじゃない
シングルトンも忘れていい 参照型と値型を区別できないと普通に困るよ
そのたびにここで質問するの?
俺はc#の仕様が面白かったので入門書みたいのを10回以上読んだ
delegateとかeventとか他にはなかったから刺激的だった >シングルトンも忘れていい
グローバル変数を散らばらせるとなかなか大変になるので、ここは最初に抑えること。
別にシングルトンでなくてもいいが、、スタチックはJson.netに保存できないので仕方なしに
調べていたらシングルトン。ほんまにトンだよな。たったこれだけのことに頭を
悩ませないといかんとは。 >>287
君は5かける3はと言われて
1から順に数字を答えてる状態にしか見えないんだけど >参照型と値型を区別できないと普通に困るよ そのたびにここで質問するの?
いままさにこれに困っている。そこでプロパティにしたらどうなの?って実験してみようと思っている。
private clsGrovalParam _Param = new clsGrovalParam() {value1 = 1};
public clsGrovalParam Param
{
get { return _Param; }
set { Param =_Param ;}
} >>290
違うよ
九九の5X3を覚える
君にはそれがない 5を3回足すとか3を5回たすとか考えたり
5X3を覚えるとかがない
1から数え上げていって9当たりで疲れて質問に来る >>287
>グローバル変数を散らばらせるとなかなか大変になるので、ここは最初に抑えること
それはそもそもグローバル変数が多いこと自体が問題。
まともな設計が身に着けば自然に減る。
シングルトンは基本的にアンチパターンであり、初心者が積極的に使うものではない。 >291
だめだよ。そういう覚え方は。最初は足と手の指を使って15までカウントする。 初心者には紛らわしい物言いだったので補足
シングルトンはメンバも含めて実質すべてグローバル変数な 休みの昼間っから真っ赤にしてる奴にろくなのはいない やりたいことと実力のレベルに差があって
ちぐはぐしてるのは間違いない
例え15まで数えて正解しても次にはつながらないので
仕組みを理解してからのほうが良いのでは? 仕組みが理解できない場合いくら手を動かしても得られるものはないんでは? 初心者はなんでも場当たり的に解決しようとするが、これは意識しないと気が付かない悪い癖 仕組みを理解するために手を動かすのは正しい
仕組みを理解せずその場の答えを出すためにやみくもに手を動かすのは正しくない >295
細部はあまり関係ないと思う。
ベテランはそういう細部をきにするが、要するにシングルトンで何をしたいのか?
どう機能するものなのか?
それが大事なポイントじゃあるまいか。 名前の問題とか実装方法の問題じゃない。
別にシングルトンでなくてもいい。
ポイントはつまりアンチスパゲッティ。w
変数1,2、−−−100位は直ぐに散らばる。
これをまとめて一つにしておけば分かりやすい。まあ名前をまとめたところで参照は100か所に
なるから、どうしたって散らばるが、変更箇所は1か所にすることができる。それに括りの名前を付けて
おけばGrepできる。そういうメリットがある。ただそれだけのことだ。でもこれが大きい。 要するにインスタンスを一個しか持たないクラスにまとめたグローバル変数。
その割に実現がややこしい。w 設定データをシングルトンでって時点で何かがおかしい class Singleton
{
private Singleton(){}
public static Singleton getInstace() {
return SingletonHolder.INSTANCE;
}
private static class SingletonHolder {
public static Singleton INSTANCE = new Singleton();
}
private clsGrovalParam _Param = new clsGrovalParam() {value1 = 1};
public clsGrovalParam Param
{
get { return _Param; }
set { Param =_Param ;}
}
}
class clsGrovalParam
{
public int value1;
public int value2;
public int value3;
}
このシングルトンは駄目だな。Getinstanceするたびに_Paramがnewされる。_Paramがシングルトンにならんだろ。w
ParamをStaticにしないでシングルトンを作るにはどうしたらいいんだ? >設定データをシングルトンでって時点で何かがおかしい
アプリで共通に使うパラメータはシングルトンにする。
のがいいと思うのですが、、、、w >>309
単体テストが困難になるから避ける
大元のインスタンスはstaticでグローバルに共有してもいいけど、
そのグローバル変数に直接アクセスするのは最小限にしてコンストラクタなどで必要なものだけ受け取るようにするのが基本だよ >>282
しっかりした入門書なら決して「読んだだけ」になることはない >>309
スレの流れを把握してないのでひょっとしたら話が噛み合ってないかもしれないけど、
そういうのは、例えばVSが吐き出すプロジェクトのスケルトンで言ったらProgramみたいな
クラスのstataicメンバーとして持てばいいだけの話で、むしろシングルトンで実装する必然性が分からない Staticで持つとJson.Netが保存を拒否する。 string json = JsonConvert.SerializeObject(Param);
こんなの。 Staticでもってコピーすりゃいいだけか? そうだよな。w あれっ、保存できた。しかしスタディックにしても値が初期化されてしまう。
なんか別のインスタンスを作ってる。 なんかstaticメンバーとstaticクラスの区別が付いてない予感... 原因が分かった。
InitializeCompornent();がLoacalエリアをクリアしてる。
そんな馬鹿な。
Local変数でParamを宣言したときに
clsParam Param = clsParam.GetInstance ().Param ;
で値を代入してるのに。
コンストラクタのInitializeCompornent();がこのLoacalエリアをクリアしてる。そういうものか? でもやっぱり違う。ローカルを宣言して同時にGetInstanceで設定したら、その値が
入っている。 OK
次にInitializeCompornent();を実行する。
その次にもう一度このローカル変数にGetInstance()で代入したらクリアされてる。
おかしい。w このスレは勉強のために見ているけどID:agf4hW9w0は初心者に害悪でしかないな あ、この人数日前からしょうもない質問したり逆ギレしたりしてるお人かなw
正義(笑)をかさに着て人を追い出すようなことを言うのは好きじゃないけど、
それでも実況みたいなレスは自分で専用スレ立ててやった方がいいんじゃないの? Gofとか興味ないの? デザインパターンの大先生だよ。それが全然動かない。w
たいそうな本出してる割には、、、、、とちょっと不信感が沸いてる。 思うにカッコつけた本でも具体例が提示できないとだめだな。
抽象的な説明はカッコいいが、具体的なサンプルで動かないとカッコばかりで駄目だな。 お前掛け算知らないの?と変わらないレスを書いて平気なんだな
いくら初心者の発言だとしてもしらける >>312
>クラスのstataicメンバーとして持てばいいだけの話で、むしろシングルトンで実装する必然性が分からない
Programの中に
static ublic int Aaaa;
って入れると このFieldにAaaaは割り当てられません。つにに規定値0を使用します。ってでるんだが、 シングルトンやっと動いた。w
Programの中に書くってのもOKだな。Fieldワーニングがでるが。 イベントとデリゲートの違いがわかりません
イベントを使わなくてもデリゲートでproperty changedが実装できました
両者の違いを教えて下さい デリゲートは特定のかたちの関数をいれれる変数
イベントはデリゲートを利用して登録した関数を実行できる仕組み >>332
イベントはメンバの一種、デリゲートは型の一種。
C#ではメソッドはオブジェクトではない。それを値として受け渡しするために、メソッドをオブジェクトとして包むための型がデリゲート。
イベントは、イベントに対してデリゲートを登録&削除するという一般的なパターンを簡単にかつ利用者に分かりやすく実装するための特殊なメンバ。
プロパティに相当する。実際、イベントの登録削除はプロパティのように独自に実装することもできる。
興味があるならイベントアクセサでググってみるといいよ。イベントを自分で実装してみれば完全に理解できるはず。 メソッドの引数に1000以上の要素を持ったリストを渡す場合、メモリの消費等考慮するとやはり参照渡しが良いでしょうか? リスト自体が参照なので、リストのアドレスをコピーするコストしか発生しないのでは?
自信はないので詳しい人教えてくだちい。 面倒くさいから解説しないが
List<T>をそのまま渡そうがrefで渡そうがほとんど何も変わらん >>336
配列やリストは渡した先でインスタンスを書き換えない(nullにしたりしない)場合はref付けずにそのまま渡せ
コピーして渡すわけじゃないから >>336
これ言葉遊びになりがちなんだよな
「値型の値渡し」、「値型の参照渡し」、「参照型の値渡し」、「参照型の参照渡し」をまとめて値渡しと参照渡しと呼ぶのが元凶なんだろうけどさ
http://ufcpp.net/study/csharp/sp_ref.html >>334
adderとremoverというのがあって、+=で繋いだときはadderが呼ばれ、-=で削除したときはremoverが呼ばれるんですね
ここが単なるデリゲートのマルチキャストとと違うところだと思いました
どうもありがとうございました >>342
っていうか、コールバックを実現したいからと単純にデリゲート変数をそのまま公開すると、
(1) 外部からnullを代入できてしまう
(2) 外部からInvokeできてしまう
こういった問題がある。
だからデリゲート変数とは別のイベントに存在意義があるんでしょう C# WPF
xaml上にキャンバス配置、その子にImageがあって、
このImageをタイマーで左に動かしたいのですが、Imageの座標の動かし方が分からないです。
Canvas.Letfや、Image.Leftと打っても「現在のコンテキストが存在しない」とエラーが返ってきます。 Blendでプロジェクト開いてストーリーボード追加して
ドラッグして終わり
という方法は一般的でないけど楽 ストーリーボードは使わず、タイマー+csのコードで出来る方法をお願いします。
image.Width ←OK
image.Height ←OK
image.Left ← 出来ない
image.Top ← 出来ない
canvasの子としてimageがあるから出来ないのかなとは思うのですが、
canvas.Left ←出来ない
canvas.Top ←出来ない
も出来ないからお手上げです。時間経過ごとに少しづつ画像を動かしたいだけなんですが・・・ 実際のimageにはLeftとかは存在しないので
別の場所で辞書のようなもので保存してる
それが添付プロパティ setleftも試してて何でだろうと思ったら、usingでsystem.windows.controlを設定していませんでした。
ありがとうございます。
添付プロパティというのも初耳なので勉強します。 大学のプログラミングの課題を家でもできるようにしたいです
大学ではemacsでcファイルを作りコンパイラー(名称不明)にかけてgnuplot上でプログラムを実行してます
↑をできるような環境を自分のノートPCに作るために何をインストールすれば足りるでしょうか?
使用PCは富士通LIFEBOOK、OSはwindows10です >>351
ここはc#のスレであってcのスレじゃない
スレチ
まあ一番簡単なのはUSB起動のlinux使うか
virtualboxにlinuix入れることかな すみません、どうやらC言語とC♯、C++の区別もついてないみたいです… 向こうに行ってcygwinやMinGWやMSYSやBOW入れろとか言われてたら笑う EmacsとGCCやGnuplot入れる前提でわざわざ変な環境使う意味がわからない >テンプレが読めない回答者、議論をしたいだけの人は邪魔
>C#に関係の無い話題や荒らしの相手や罵倒レスはやめてください どう見てもこのシチュエーションでecmasは重要じゃないということが分からないおまえに笑う 学校の環境がemacsなんだろ
マクロ使ってたら他じゃ実行できないじゃん コマンドでやればいいだけだろ(笑)
わざわざlinux入れる労力 w Linux側で仕事してるヤツ、羽振りはいいけどいつもイライラしてるね Emacs使いたがるやつは医者に診てもらえっていってたのはStackOverflowの中の人だっけ 誰だって今だったらemacs何か使うなよって思うわ
vscodeとか使ったほうがいい
でもそれが条件なんだから仕方がない
winsowsにcygwinやMinGWやMSYS入れるのは環境が汚れるだけ
git for winとバッティングするし >>371
path を適当に走査するだけで、なんとでもなるのでは? >>370
この人、twitterでもMicrosoftの中の人たちにしょっちゅう議論ふっかけてておもろいよ 1) StudentName student1 = new StudentName("Craig", "Playstead");
2) StudentName student2 = new StudentName
{
FirstName = "Craig",
LastName = "Playstead",
};
1)、2)初期化方法だけど、これってどっちもインスタンスを二つ作ってるよな。
上の方はstudent1というインスタンスを作ってさらにnewでインスタンスを作ってコピーしてる。
C#って初期化するのにインスタンスをわざわざ余分に作らないと初期化できないわけ?
無駄って感じがするが、、 >>374
まずは入門書を一通り終えよう
話はそれからだ class Program
{
static void Main(string[] args)
{
Person p1, p2;
p1 = new Person(); // 引数なしのコンストラクタ
p2 = new Person("太田隆", 29); // 引数ありのコンストラクタ
p1.Name = "斉藤花子";
p1.Age = 18;
p1.showDatas();
p2.showDatas();
}
}
こういう例でもさ、p1,p2って最初は空っぽでNew Person()で初めて実のあるものを作って渡すのかと思っていたら
P1、P1を宣言したときから実がはいってる。つまり実体ができている。それでnewでまた実を再度作って、代入してるんだね。
だとするとこのプログラムは酷い例だよな。p1.Name = "斉藤花子";をするためには p1 = new Person();これは意味がない。
Person p1;で既にコンストラクタは実行されてるんだろ。なんでp1=new Person();なんてやるんだよw >まずは入門書を一通り終えよう 話はそれからだ
間違いだらけの入門書。w
376をみてみなよ。 >>376
変数とnewで両方という意味ならインスタンスは片方でしか作っていない
参照型(クラス)の変数は実質ポインタなのでnewで作られた実体への参照が入る
値型(構造体)は変数を実体として(アドレスが参照され)newでコンストラクタを呼び出す
変数宣言だけでは参照型はnullだし、値型は領域確保だけでコンストラクタは呼び出されていない そんなことはないよ。
クラスPersonにpublic static int id =0;をいれて
Person(){ ++id;} のようにコンストラクタでインスタンス生成ごとにidをインクリメント
してみたら見事に2つインクリントしてる。だから君も勘ちがいしてる。 ■ このスレッドは過去ログ倉庫に格納されています