C# スケルトン・ウィンドウ

この書き方いいのかしら(n´･ω･｀)-3ふにゅ

```csharp
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace WinFormSkeleton
{
	static class Program
	{
		[STAThread]
		static void Main()
		{
			Init_Graphics Parts_of_Graphics = new Init_Graphics( );
			Application.EnableVisualStyles( );
			Application.Run( Parts_of_Graphics.MainFormProvider() );
		}
	}
	class Init_Graphics
	{
		private IContainer components = null;
		private Form main_form;
		public Init_Graphics()
		{
			components = new Container( );
			main_form = new Form( );
			components.Add( main_form );
		}
		public Form MainFormProvider() 
		{
			return this.main_form;
		}
	}
}
```

かきなおしー

```csharp
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace WinFormSkeleton
{
	static class Program
	{
		[STAThread]
		static void Main()
		{
			Window win = new Window( 0, 0, 600, 400, "Title" );
			Application.EnableVisualStyles( );
			Application.Run( win.created );
		}
	}
	class Window : IDisposable
	{
		private const int DEFAULT_FORM_SIZE = 300;

		private IContainer components;
		private Form form;
		string form_title;
		private int posX, posY, width, height;
				
		/* コンストラクタ
		 * 目的：デフォルトのフォーム・インスタンスを作成					 */
		public Window() 
		{
			components = new Container( );
			form = new Form( );
			components.Add( form );
		}
		/* コンストラクタ ( オーバロード )
		 * 目的：フォームのX軸、Y軸、幅、高さ、タイトルを設定	
		 *		フォームのインスタンスを作成						
		 * 引数：X軸(int) Y軸(int) 幅(int) 高さ(int) タイトル(string)	
		 * 備考：X軸、Y軸、幅、高さが負数の場合デフォルト値を設定			*/
		public Window( int x, int y, int w, int h, string title = "" )
		{
			components = new Container( );
			form = new Form( );
			// 負数かチェック
			if ( check_valid( x, y, w, h ) == false ) {
				throw new ArgumentException("Arguments less then zero");
				explicit_init( );
			}
			posX = x;	posY = y;
			width = w;	height = h;
			form_title = title;

			form.Location = new Point( x, y );
			form.Size = new Size( w, h );
			form.Text = form_title;
			components.Add( form );

		}
		/* check_valid メソッド	[ヘルパ]
		 * 目的：フォームのX軸、Y軸、幅、高さが負の数かチェック 
		 * 引数：X軸(int) Y軸(int) 幅(int) 高さ(int)
		 * 戻値：真偽値												*/
		bool check_valid( int x, int y, int w, int h )
		{
			int[] tmp = new int[] { x, y, w, h };

			// 負数に出会った時点で偽を返し呼び出し元に制御を戻す
			foreach( int check in tmp  ) {
				if ( check < 0 ) return false;
			}
			return true;
		}
		/* Explicit_initメソッド [ユーティリティ]
		 * 目的：メンバ変数を明示的にデフォルト値で初期化
		 * 引数：なし
		 * 戻値：なし													 */
		private void explicit_init()
		{
			components = null;
			form_title = String.Empty;
			posX = posY = 0;
			width = height = DEFAULT_FORM_SIZE;
		}
		/* created プロパティ [アクセス]
		 * 目的：フォーム・オブジェクトのインスタンスを返す。		 */
		public Form created
		{
			get {
				if ( form == null )
					throw new NullReferenceException( "Object is NULL" );
				else
					return form;
			}
			private set { ;}
		}

		/* Disposeメソッド
		 * 目的：リソースの解放					
		 * 備考：デストラクタ使いたいお(´・ω・`)						 */
		public void Dispose()
		{
			Dispose( true );
			GC.SuppressFinalize( this );
		}
		internal void Dispose( bool terminate )
		{
			if ( terminate == true && components != null ) {
				this.Dispose( );
			}
		}
	}
}
```