{{fbdoc item="title" value="SUB (Member)"}}----
Declares or defines a member procedure.

{{fbdoc item="syntax"}}##
	{ [[KeyPgType Type]] | [[KeyPgClass Class]] | [[KeyPgUnion Union]] } //typename//
		[[KeyPgDeclare declare]] [ [[KeyPgStaticMember static]] | [[KeyPgConstMember const]] ] **Sub** //fieldname// [//calling convention specifier//] [ [[KeyPgAlias alias]] //external_name// ] ( [ //parameters// ] ) [ [[KeyPgStatic Static]] ] 
	End { [[KeyPgType Type]] | [[KeyPgClass Class]] | [[KeyPgUnion Union]] }

	**Sub** //typename//.//fieldname// ( [ //parameters// ] ) [ [[KeyPgExport Export]] ]
		//statements//
	**End Sub**
##
{{fbdoc item="param"}}
	##//typename//## 
		name of the ##[[KeyPgType Type]]##, ##[[KeyPgClass Class]]##, or ##[[KeyPgUnion Union]]##
	##//fieldname//## 
		name of the procedure
	##//external_name//##
		name of field as seen when externally linked
	##//parameters//## 
		the parameters to be passed to the procedure
	##//calling convention specifier//##	
		can be one of: ##[[KeyPgCdecl Cdecl]]##, ##[[KeyPgStdcall Stdcall]]## or ##[[KeyPgPascal Pascal]]##

{{fbdoc item="desc"}}
	##**Sub**## members are accessed with ##[[KeyPgOpMemberAccess Operator . (Member access)]]## or ##[[KeyPgOpPtrMemberAccess Operator -> (Pointer to member access)]]## to call a member procedure and may optionally accept parameters either ##[[KeyPgByval byval]]## or ##[[KeyPgByref byref]]##.  ##//typename//## be overloaded  without explicit use of the ##[[KeyPgOverload Overload]]## keyword.

	##//typename//## is the name of the type for which the ##**Sub**## method is declared and defined.  Name resolution for ##//typename//## follows the same rules as procedures when used in a ##[[KeyPgNamespace Namespace]]##.

	A hidden ##[[KeyPgThis this]]## parameter having the same type as ##//typename//## is passed to non-static member procedures.  ##[[KeyPgThis this]]## is used to access the fields of the ##[[KeyPgType Type]]##, ##[[KeyPgClass Class]]##, or ##[[KeyPgUnion Union]]##.
	To access duplicated symbols defined outside the Type, use: ##.""SomeSymbol""## (or ##..""SomeSymbol""## if inside a [[KeyPgWith With..End With]] block).

	A ##[[KeyPgStaticMember Static (Member)]]## may be declared using the ##**Static**## specifier.  A ##[[KeyPgConstMember Const (Member)]]## may be declared using the ##**Const**## specifier.

{{fbdoc item="ex"}}
{{fbdoc item="filename" value="examples/manual/udt/sub.bas"}}%%(freebasic)
type Statistics
  count as single
  sum as single
  declare sub AddValue( byval x as single )
  declare sub ShowResults( )
end type

sub Statistics.AddValue( byval x as single )
  count += 1
  sum += x
end sub

sub Statistics.ShowResults( )
  print "Number of Values = "; count
  print "Average          = ";
  if( count > 0 ) then
	print sum / count
  else
	print "N/A"
  end if
end sub

dim stats as Statistics

stats.AddValue 17.5
stats.AddValue 20.1
stats.AddValue 22.3
stats.AddValue 16.9

stats.ShowResults
%%
**Output:**
%%
Number of Values =  4
Average          =  19.2
%%

{{fbdoc item="lang"}}
	- Only available in the //[[CompilerOptlang -lang fb]]// dialect.

{{fbdoc item="see"}}
	- ##[[KeyPgClass Class]]##
	- ##[[KeyPgMemberFunction Function (Member)]]##
	- ##[[KeyPgSub Sub]]##
	- ##[[KeyPgType Type]]##

{{fbdoc item="back" value="CatPgUserDefTypes|User Defined Types"}}